let
ES6 新增了 let
和 const
来声明变量,主要是解决 var
声明变量所造成的困扰和问题:
var
不能用于定义常量var
可以重复声明变量var
存在变量提升var
不支持块级作用域
let for循环
for
循环头部的 let
不仅将 i
绑定到了 for
循环的块中,事实上它将其重新绑定到了循环的每一个迭代中,确保使用上一个循环迭代结束时的值重新进行赋值。
// 通过另一种方式说明每次迭代时都进行重新绑定的行为
{
let j;
for(j = 0; j< 10; j++) {
let i = j; // 每个迭代重新绑定
console.log(i);
}
}
const
ES6 新增,常量不能更改,必须有默认值。
const
实际上保证的并不是变量的值不得改动,而是变量指向的那个内存地址所保存的数据不得改动。对于简单类型的数据(数值、字符串、布尔值)值就是变量指向的那个内存地址,因此等同于常量。但对于复合类型的数据(主要是对象和数组)变量指向的内存地址保存的只是一个指向实际数据的指针,const 只能保证这个指针是固定的,至于它指向的数据结构是不是可变的,就完全不能控制了。因此,将一个对象声明为常量必须非常小心。
const foo = {}
// 为 foo 添加一个属性,可以成功
foo.prop = 123
// 将 foo 指向另一个对象,就会报错
foo = {}
// TypeError:'foo' is read-onle
上面代码中,常量 foo 储存的是一个地址,这个地址指向一个对象。不可变的只是这个地址,即不能把 foo 指向另一个地址。但对象本事是可变的,所以依然可以为其添加新属性。
const a = []
a.push('Hello') // 可执行
a.length = 0 // 可执行
a = ['Dave'] // 报错
以上内容摘自 Nicholas C.zakas《深入理解ES6》,强烈推荐阅读该书。他的另一本大作是《JavaScript高级程序设计》