const
let
以及暂存死区
const
在声明时就要赋值,如果是赋值常量那么不可以改变值;如果定义的是数组或者对象,可以改变属性值
let
和const
可以定义块级作用域中的变量,都存在暂存死区:通过 let
声明的变量直到它们的定义被执行时才初始化。但let
命令一旦创建了一个变量a,也就限制了其所在的局部作用域使用的变量a只能是let所定义的a。因为没有let变量提升,所以在变量初始化前访问该变量会导致 ReferenceError
。该变量处在一个自块顶部到初始化处理的“暂存死区”中。
注意:如果const
在全局和局部都声明了同一个变量s,在局部作用域中出现的s都会被认为是由在局部作用域中声明的那个
const
声明的数据始终无法更改吗?
不是的。const
实际上保证的,并不是变量的值不得改动,而是变量指向的那个内存地址所保存的数据不得改动。对于简单数据类型,值就保存在指向的地址,所以数值不可更改。但是对于引用对象来说,变量指向的地址保存的是指向实际数据的指针。
const a = {name: "iiii", age: "99"}
a.name = "oooo"//可执行
a = ooo//不可执行,报错
顶层对象与全局对象
ES5以及之前,顶层对象window
与全局对象时等价的
ES6 为了保持兼容性,var
命令和function命令声明的全局变量,依旧是顶层对象的属性;但let
命令、const
命令、class
命令声明的全局变量,不属于顶层对象的属性。