ECMAScript6-语句和声明

23 阅读2分钟

let

ES6 新增了 letconst 来声明变量,主要是解决 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高级程序设计》