var

  • var 命令会发生“变量提升”现象,即变量可以在声明之前使用,值为 undefined 。
  • 内层变量可能覆盖外层变量
  • 用来计数的循环变量泄露为全局变量

    var a = 100;
    console.log(a,window.a);    // 100 100
     
    let b = 10;
    console.log(b,window.b);    // 10 undefined
     
    const c = 1;
    console.log(c,window.c);    // 1 undefined
    

let

  • 声明的全局变量不会挂在顶层对象下面
  • 所声明的变量一定要在声明后使用,否则报错,报错 ReferenceError
  • 暂时性死区,只要块级作用域内存在 let 命令,它所声明的变量就“绑定”( binding )这个区域,不再受外部的影响,在代码块内,使用 let 命令声明变量之前,该变量都是不可用的。
  • 不允许重复声明

const

  • 声明的全局变量不会挂在顶层对象下面
  • const 声明之后必须马上赋值,否则会报错
  • const 简单类型一旦声明就不能再更改,复杂类型(数组、对象等)指针指向的地址不能更改,内部数据可以更改。
  • const 一旦声明变量,就必须立即初始化,不能留到以后赋值。
  • const 命令声明的常量也是不提升,同样存在暂时性死区,只能在声明的位置后面使用。

    const a = 100; 
     
    const list = [];
    list[0] = 10;
    console.log(list);  // [10]
     
    const obj = {a:100};
    obj.name = 'apple';
    obj.a = 10000;
    console.log(obj);  // {a:10000,name:'