var、let、const

ES6 之前是没有块级作用域的概念的,块作用域有 { } 包括,if语句和 for语句里面的{ }也属于块作用域。

1、var声明的变量会挂载在window对象上而let和const声明的变量不会

因此,var 的这一特性,可能会造成 window 全局变量的污染。

2、var 声明的变量存在变量提升,let 和 const 声明的变量不存在变量提升

3、var 声明不存在块级作用域,let 和 const 声明存在块级作用域

{
        var a = 1;
        let b = 2;
    }

    console.log(a);
    console.log(b);

错误信息:Uncaught ReferenceError: b is not defined.
var声明的变量直接提升至全局变量

4、同一作用域下,var 可以重复声明同名变量,let 和 const 不能重复声明变量

5、let 和 const 的暂时性死区(DTC)

const a = 1;
    function test() {
        console(a);
        const a = 2;
    }
    test();

错误信息:Uncaught ReferenceError: Cannot access ‘a’ before initialization
如果在当前块级作用域中使用了变量a,并且当前块级作用域中通过 let/const 声明了这个变量,那么,
声明语句必须放在使用之前,也就是所谓的 DTC(暂时性死区)。

6、const:一旦声明必须赋值,并且声明后不能再修改。
这里的“不能再修改”指的是不能改变内存地址的引用,因此:
1.const 声明基本数据类型,则无法被修改;
2.const 声明引用数据类型(即“对象”),对象里的内容是可以被修改的。

function test() {
        const b = [];
        b[0] = 2;
        console.log('b[0]=' + b[0]);

        const a = 1;
        a = 2;
        console.log('a=' + a);
    }

结果:
打印:b[0]=2
异常:TypeError: Assignment to constant variable.
不可给常量赋值

7、总结:
1)能不用 var的时候都不用var
2)能用 const 的地方都用 const
3)不能用 const 的地方,就用 let