1、let
命令所在的代码块内无效。
如果区块中存在 let
和const
命令,这个区块对这些命令申明的变量,从一开始就造成了关闭作用域。但凡在申明之前就应用这些变量,就会报错。
var tmp = 123;
if (true) {tmp = 'abc'; // ReferenceError let tmp;}
在代码块内,应用 let
命令申明变量之前,该变量都是不可用的。这在语法上,称为“暂时性死区”(temporal dead zone,简称 TDZ)。
ES5 只有全局作用域和函数作用域,没有块级作用域,这带来很多不合理的场景。
第一种场景,内层变量可能会笼罩外层变量。
第二种场景,用来计数的循环变量泄露为全局变量
块级作用域的呈现,实际上使得取得广泛应用的匿名立刻执行函数表达式(匿名 IIFE)不再必要了。
顶层对象,在浏览器环境指的是 window
对象,在 Node 指的是 global
对象。ES5 之中,顶层对象的属性与全局变量是等价的。
ES6 规定,let
命令、const
命令、class
命令申明的全局变量,不属于顶层对象的属性。
2、解构赋值
let [a, b, c] = [1, 2, 3];
let [head, ...tail] = [1, 2, 3, 4];
head // 1 tail // [2, 3, 4]
默认值
let [x = 1] = [undefined];
x // 1
let [x = 1] = [null];
x // null
ES6 外部应用严格相等运算符(===
),判断一个地位是否有值。所以,只有当一个数组成员严格等于 undefined
,默认值才会失效。如果一个数组成员是null
,默认值就不会失效,因为null
不严格等于undefined
。
对象的解构赋值
let {bar, foo} = {foo: 'aaa', bar: 'bbb'};
foo // "aaa" bar // "bbb"
let {baz} = {foo: 'aaa', bar: 'bbb'};
baz // undefined
3、
ES6 为字符串增加了遍历器接口,使得字符串能够被 for...of
循环遍历。这个遍历器最大的长处是能够辨认大于 0xFFFF
的码点,传统的 for
循环无奈辨认这样的码点。
模板字符串(template string)是增强版的字符串,用反引号(`)标识。它能够当作一般字符串应用,也能够用来定义多行字符串,或者在字符串中嵌入变量。
`${x} + ${y} = ${x + y}`
箭头函数有几个应用留神点。
(1)函数体内的 this
对象,就是定义时所在的对象,而不是应用时所在的对象。
(2)不能够当作构造函数,也就是说,不能够应用 new
命令,否则会抛出一个谬误。
(3)不能够应用 arguments
对象,该对象在函数体内不存在。如果要用,能够用 rest 参数代替。
(4)不能够应用 yield
命令,因而箭头函数不能用作 Generator 函数。