ES6笔记-01 let 和 const 命令

es6:http://es6.ruanyifeng.com

ES6笔记系列文章最初分布在简书(一篇中包含了整个系列),时间为 2018.06.27 16:29 。
链接:https://www.jianshu.com/p/1897185f8f23

1 let 和 const 命令

1.1 let 命令

基本用法

  • let 声明块级作用域变量。
var a = [];
for (let i = 0; i < 10; i++) {
  a[i] = function () {
    console.log(i);
  };
}
a[6](); // 6
  • for 循环有一个特别之处,就是设置循环变量的那部分是一个父作用域,而循环体内部是一个单独的子作用域。

不存在变量提升

  • let 声明的变量一定要在声明后使用。

暂时性死区

  • ES6 明确规定,如果区块中存在let和const命令,这个区块对这些命令声明的变量,从一开始就形成了封闭作用域。凡是在声明之前就使用这些变量,就会报错。全局变量不对其产生影响。
  • 在代码块内,使用let命令声明变量之前,该变量都是不可用的。这在语法上,称为“暂时性死区”(temporal dead zone,简称 TDZ)。

不允许重复声明

  • let不允许在相同作用域内,重复声明同一个变量。

1.2 块级作用域

1.3 const 命令

基本用法

  • const 声明一个只读的常量,所以,在声明的时候就应该赋值。

本质

  • const实际上保证的,并不是变量的值不得改动,而是变量指向的那个内存地址不得改动。对于简单类型的数据(数值、字符串、布尔值),值就保存在变量指向的那个内存地址,因此等同于常量。但对于复合类型的数据(主要是对象和数组),变量指向的内存地址,保存的只是一个指针,const只能保证这个指针是固定的,至于它指向的数据结构是不是可变的,就完全不能控制了。
  • 如果真的想将对象冻结,应该使用Object.freeze方法。
  • 除了将对象本身冻结,对象的属性也应该冻结。下面是一个将对象彻底冻结的函数。
var constantize = (obj) => {
  Object.freeze(obj);
  Object.keys(obj).forEach( (key, i) => {
    if ( typeof obj[key] === 'object' ) {
      constantize( obj[key] );
    }
  });
};

ES6 声明变量的六种方法

  • ES5:var、function
  • ES6:var、function、let、const、import、class

1.4 顶层对象的属性

  • 顶层对象,在浏览器环境指的是window对象,在 Node 指的是global对象。ES5 之中,顶层对象的属性与全局变量是等价的。
  • ES6 为了改变这一点,一方面规定,为了保持兼容性,var命令和function命令声明的全局变量,依旧是顶层对象的属性;另一方面规定,let命令、const命令、class命令声明的全局变量,不属于顶层对象的属性。也就是说,从 ES6 开始,全局变量将逐步与顶层对象的属性脱钩。

1.5 global 对象

  • ES5 的顶层对象,本身也是一个问题,因为它在各种实现里面是不统一的。
  • 垫片库 system.global 可以在所有环境拿到global。