本文章总结自阮一峰老师ES6入门
-
let、const和var的使用和区别
-
举个例子
var a = []; for (var i = 0; i < 10; i++) { a[i] = function () { console.log(i); }; } a[6](); // 10 //如果用let代替var,输出就为6 //var为何为10不必多说,用let声明的i,每一次的i只在当前循环有效,下一轮循环的时候的i其实是一个新的变量 //JavaScript引擎会记住上一次循环的值,因此会输出6 //此外for循环的一个特别之处,设置循环变量的那部分是一个父作用域,而循环体内部是一个子作用域 for(let i=0;i<3;i++){ let i = 'abc'; console.log(i);//打印3次abc,表明两个i有不同的作用域 }
-
let不存在变量提升,即必须声明后使用
-
let、const存在暂时性死区,只要块级作用域内存在let命令,它所声明的变量就绑定在这个区域,不受外界影响
var tmp = 123; if(true){ console.log(tmp);//报错ReferenceError let tmp=456; } ------------- typeof x ==> //报错ReferenceError let x ------------- //未声明的变量反而不会报错,只是undefined typeof undeclared_variable ==> "undefined" ------------- //隐蔽的死区 function bar(x=y,y=2){ return [x,y] } bar(); //报错,这里第一个参数x=y,此时y没有声明,所以报错。换成x=2,y=x不会报错 ------------- let x=x; ==>ReferenceError x is not defined ------------- let x = do{ //x得到块级作用域{}的返回值 let t=f(); t*t+1; }
-
let不允许在同一作用域中重复声明变量
-
const声明一个只读常量,一旦声明不可更改。同时,声明时必须立刻赋值
-
const作用域与let相同,也存在死区,只能在声明位置后使用
-
const实际保证的不是变量的值不可改变,而是变量指向的内存的地址不可改变
- 比如:
const foo={} foo.prop=123; ==>正确 foo={}; ==>error : "foo" is read-only 改变地址就会报错
-
如果想将对象冻结,使用Object.freeze方法:
const foo=Object.freeze({}); foo.prop=123; ==> 常规模式不起作用,严格模式报错
-
ES5声明变量只有var 和 function,ES6共有6种:加入了let,const,import,class
记录学习ES6的总结,若有错误和建议,请指正…
-