let 和 const 时ES6中新增声明变量的方式。let、const与var的区别如下:
作用域的不同
var 声明的变量只有两种作用域:全局作用域与函数(局部)作用域,没有块级作用域。在ES6前需要用闭包进行块级作用域的模拟。
let与const声明的变量具备了块级作用域。
重复声明变量的不同
可以使用var重复声明同名变量(严格模式不允许)
不允许在相同作用域内,使用let和const重复声明同一个变量。
变量提升
var命令会发生“变量提升现象”,无论声明在何处,变量声明会被提至其所在作用域的顶部,于是变量可以在声明之前使用,值为undefined,
let与const则没有变量提升,在声明变量之前就访问变量的话,会直提示ReferenceError(引用错误)。如果代码中存在let命令,这个代码块对这些命令声明的变量,从一开始就形成了封闭作用域。凡是在声明之前就使用这些变量,就会报错。所以在代码块内,使用let命令声明变量之前,该变量是不可用的。在这语法上,称为“暂时性死区”(temporal dead zone,简称TDZ)
全局变量与全局对象的属性
var声明的全局变量可以作为全局对象(window/global)的属性存在。
let和const声明的全局变量则不属于全局对象的属性
const声明的常量的改变
const用于声明一个基本类型的时候为常量,其值是不可修改的(不能对常量重新赋值);
声明对象时,对象内部的属性是可以修改的,因为对象是引用数据类型,是把一个内存地址存放到const声明的常量中。修改对象内部的属性不涉及到引用地址的变化,是可以修改的。但是要对常量进行重新赋值则不被允许。