1、
let命令所在的代码块内无效。

如果区块中存在letconst命令,这个区块对这些命令申明的变量,从一开始就造成了关闭作用域。但凡在申明之前就应用这些变量,就会报错。

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 函数。