var、let、const区别

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);
})()

……

原文地址:https://www.cnblogs.com/haoxl/p/6817589.html