Table of Contents
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。