目录

  • ES6简介
  • 对浏览器的内核的了解?有哪些内核?(重点6分)
  • ES5和ES6有什么区别?(重点有时15分有时6分)
  • 讲一讲ES6的版本怎么更新的?(问的少)
  • let
  • const
  • 笔试题
  • 块级作用域


ES6简介

  • ES6,全称 ECMAScript 6.0 ,是 JavaScript 的下一个版本标准,2015.06 发版。
  • 目前各大浏览器基本上都支持 ES6 的新特性,其中 Chrome 和 Firefox 浏览器对 ES6 新特性最友好,IE7~11 基本不支持 ES6。
    1.IE浏览器内核:Trident内核,也是俗称的IE内核;
    2.Chrome浏览器内核:统称为Chrome内核,以前是Webkit内核,现在是Blink内核;
    3. Firefox浏览器内核:Gecko内核,俗称Firefox内核;
    4. Safari浏览器内核:Webkit内核;
    5. Opera浏览器内核:最初是Presto内核,后来是Webkit,现在是Blink内核

对浏览器的内核的了解?有哪些内核?(重点6分)

  浏览器要渲染出网页给用户看,必须加载html编码和js脚本,渲染引擎渲染页面的UI和js执行引擎操作内存,就是浏览器的的重要组成程序:内核
  根据不同的浏览厂商 他们使用了不同的内核, 内核的程序是很难实现的,根据我的了解有一些内核是公司自己实现的有一些是直接借用的,比如:
  1、IE浏览器内核:Trident内核,也是俗称的IE内核;

  2、Chrome浏览器内核:统称为Chromium内核或Chrome内核,以前是Webkit内核,现在是Blink内核;

  3、Firefox浏览器内核:Gecko内核,俗称Firefox内核;

  4、Safari浏览器内核:Webkit内核;

  5、Opera浏览器内核:最初是自己的Presto内核,后来是Webkit,现在是Blink内核;

  6、自己搜一搜国内出名:360 2345 夸克

  7、渲染引擎

ES5和ES6有什么区别?(重点有时15分有时6分)

  1.通过不同的语法作答(说服面试官 你新技术是会的)
  2.准备几个技术点去讲:优化 性能 缺陷
  3.自己去查一查ES6的更深一点的技术点(高薪意向的同学)

例:

  • ES6新增了箭头函数,es5没有;
  • ES6中新增了块级作用域,es5没有;
  • ES6引入Class概念,不再像ES5一样使用原型链实现继承;
  • ES6中可以设置默认函数参数,es5不行;
  • ES6中新增了promise特性。

讲一讲ES6的版本怎么更新的?(问的少)

  任何人都可以向标准委员会(又称 TC39 委员会)提案修改语言标准。

  一种新的语法从提案到变成正式标准,需要经历五个阶段

     - Stage 0 - Strawman(展示阶段)
     - Stage 1 - Proposal(征求意见阶段)
     - Stage 2 - Draft(草案阶段)
     - Stage 3 - Candidate(候选人阶段)
     - Stage 4 - Finished(定案阶段)

let

   let 声明的变量只在 let 命令所在的代码块内有效(块级作用域、局部作用域)
  ES6 推荐在函数中使用 let 定义变量,而非 var。

  1. 只在代码块内有效
    代码块:
    obj={ } 对象
    function(){ }函数
    { } , if(){ }  ,for(){ } 代码块
//{}括起来的代码块
		{
			let x = 0;
			var y = 520;
    
		}
		console.log(x); 	// 报错:a未声明
		console.log(y);	 	// 520
  1. 不能重复声明
var x = 1;
		var x = 2;
		console.log(x); 	 // 2

		let y = 3;
		let y = 4;
		console.log(y); 	 // Identifier 'x' has already been declared
  1. 在for循环中很适用
for (var i = 0; i < 10; i++) {
  		setTimeout(function(){
    		console.log(i);
  		})
		}
		// 输出十个 10

		for (let j = 0; j < 10; j++) {
  		setTimeout(function(){
    		console.log(j);
  		})
		}
		// 输出 0~9
  1. 不存在变量提升
console.log(aa); //undefined
        var aa = 123;

        console.log(bb);//Cannot access 'bb' before initialization
        let bb = 234;
        console.log(bb);
  1. 存在暂时性死区(TDZ):防止在变量声明之前就使用它
// typeof也不再是一个百分百安全的操作了
        let cc = 111;
        if(true){
             console.log(typeof cc); //报错,不存在cc
            let cc = 222;
        }

const

  • const 声明一个只读的常量,声明后常量的值就不能改只能用
  • 常量一旦声明就必须赋值
//const  js的常量修饰符
		//let  var 修饰的变量的值可以被修改
				const url="http://www.百度.com"
				url=200		//报错
		//其他语法同let 
		// 只能初始化一次:初始化--第一次赋值

笔试题

let a=90
			if(true){
				console.log(a)
				var a=10
		}
		console.log(a)
		//报错:不能声明相同的a
		//原因:var a和let a均在全局作用域下

块级作用域

  • ES5 只有全局作用域和函数作用域

   不足:1. 内层变量可能会覆盖外层变量,用来计数的变量泄露为全局。

var a = 123;
        function fn() {
        	//var a;			//变量提升隐式声明
            console.log(a);		//undefined   
            if (true) {
                var a = 345;
            }
        }
        fn()

    2. 用来计数的变量泄露为全局。

var str = 'hello';
		for (var i = 0; i < s.length; i++) {
  		console.log(str[i]);
		}
		console.log(i); // 5   循环结束后,变量i并没有消失,泄露成了全局变量。
  • let为 JavaScript 新增了块级作用域

    块级作用域允许任意嵌套(内层可以使用外层变量,但外层不能使用内层变量)

{
            let a = 123;
            {
                let b = 123;
                console.log(a);
            }
        }

    允许在块级作用域内声明函数。
    函数声明类似于var,即会提升到全局作用域或函数作用域的头部。
    同时,函数声明还会提升到所在的块级作用域的头部。

//在ES5环境中
        function f() { console.log('I am outside!'); }
        (function () {
        	// function f() { console.log('I am inside!'); }    //函数提升,不管if语句是否能执行
            if (false) {
                function f() { console.log('I am inside!'); }
            }
            f();		//I am inside!
        }());


		//在ES6环境中
		function f() { console.log('I am outside!'); }
        (function () {
            if (false) {
                function f() { console.log('I am inside!'); }
            }
            f();		// 报错   f is not a function
        }());