1.let不存在变量提升,必须升明后才可用。
'use strict'; (function(){ console.log(varTest); console.log(letTest); var varTest = 'var'; let letTest = 'let'; }()) //结果:undefined // letTest is not defined
2.let不允许在相同作用域内,重复声明同一个变量。
(function(){ let let1 = 'test let'; let let1 = 'let changed';//Identifier 'let1' has already been declared console.log(let1); })();
而var则可以正常使用
(function(){ var var1 = 'test var'; var var1 = 'var changed'; console.log(var1);//var changed })();
3.let为块级作用域。当let用来做循环变量计数时,循环结束它便结束,不会泄露。
var s = 'hello'; for(var i=0;i< s.length;i++){ console.log(s[i]);//hello } console.log(i);//5
'use strict'; var s = 'hello'; for(let i=0;i< s.length;i++){ console.log(s[i]);//hello } console.log(i);//i is not defined
4.const声明一个只读的常量。一旦声明,常量的值就不能改变。与let基本类似,同样声明的常量也不会提升,只能在声明后使用。
'use strict'; (function(){ const a = 1; a = 2;//Assignment to constant variable. console.log(a); })()
5.const本质上保证的不是变量的值不能改动,而是变量指向的内存地址不能改动。所以对于简单类型的数据(数值、字符串、布尔值),值就保存在变量指向的那个地址,因此等同于常量。但对于复合类型的数据(对象、数组)变量指向的内存地址保存的只是一个指针,const只能保证这个指针是固定的,至于它指向的数据结构是不是可变的,就完全不能控制了。
'use strict'; (function(){ const foo = {name:'haoxl',age:18} foo.age = 25; console.log(foo);//{name: "haoxl", age: 25} foo = {name:'liuxb',age:25};//Assignment to constant variable. console.log(foo); })()
……