ES6新增特性——变量的声明方式:let 和 const

156 阅读3分钟

ES5 只有两种声明变量的方法:var命令和function命令。
ES6 除了添加letconst命令,后面章节还会提到另外两种声明变量的方法:import命令和class命令。所以,ES6 一共有 6 种声明变量的方法。不过下面我们具体先只介绍 let 和 const 命令。

1、let、const 与 var 的区别

(1)块级作用域: 块作用域由 { } 包裹着,let 和 const 具有块级作用域,var 不存在块级作用域。let 和 const 声明的变量只在它所在的代码块有效,即块级作用域可以有效解决 ES5 中的两个问题:

  • 内层变量可能覆盖外层变量
  • 用来计数的循环变量泄露为全局变量

(2)暂时性死区: 在代码块内,使用 let、const 命令声明变量之前,该变量都是不可用的。这在语法上,称为暂时性死区。使用 var 声明的变量不存在暂时性死区。

(3)变量提升: var 存在变量提升,即变量可以在声明之前使用,值为undefined。而 let、const 不存在变量提升,即它们声明的变量只能在声明之后使用,否则会报错。

(4)重复声明: var 可以重复声明变量,后声明的同名变量会覆盖之前声明的变量。const、let 不允许在相同作用域内,重复声明同一个变量。

(5)添加为全局对象的属性: 浏览器的全局对象是 window,Node 的全局对象是 global。var 声明的变量为全局变量,并且会将该变量添加为全局对象的属性,但是 let 和 const 不会。

2、const 与 var、let的区别

(1)初始值设置: 在变量声明时,var 和 let 可以不用设置初始值。而 const 声明变量必须设置初始值。

(2)指针指向: var 和 let 创建的变量是可以更改指针指向。但 const 声明的变量是不允许改变指针的指向。

  • const实际上保证的,并不是变量的值不得改动,而是变量指向的那个内存地址所保存的数据不得改动。
    • 对于基本类型的数据(数值、字符串、布尔值),值就保存在变量指向的那个内存地址(栈区),因此等同于常量。
    • 但对于引用类型的数据(主要是对象和数组),变量指向的内存地址,保存的只是一个指向实际数据的指针,const只能保证这个指针是固定的(即总是指向一个固定的堆区内存地址),至于它指向的数据结构是不是可变的,就完全不能控制了。因此,将一个对象声明为常量必须非常小心。

3、总结

区别varletconst
    是否有块级作用域        ×       ✔️       ✔️   
    是否存在变量提升       ✔️       ×       ×   
    是否添加全局属性       ✔️       ×       ×   
    能否重复声明变量       ✔️       ×       ×   
    是否存在暂时性死区        ×      ✔️      ✔️   
    是否必须设置初始值        ×       ×      ✔️   
    能否改变指针指向       ✔️      ✔️       ×