Chrome 控制台中 ES6 解构的奇怪行为

Strange behavior of ES6 destructuring in Chrome console

环境

Google Chrome: 61.0.3163.79 beta(64 位)(队列:Beta)

JavaScript 引擎:V8 6.1.534.32

代码

在Chrome中,打开一个新标签页,在控制台中一一输入以下代码:

let [a = b, b = 1] = [];

typeof a;

let a = 'other value';

a = 'other value';

输出为:

问题

有人可以解释为什么第一个语句 let [a = b, b = 1] = [] 使变量 a 成为 'a is not defined''标识符 'a' 已经同时声明了'?

第一个语句执行的魔法是什么?

是否与ES6有关“Temporal Dead Zone” (TDZ)

更新

示例代码无效,我只想知道输出的原因。 :)

您甚至在声明 b 之前就试图将 b 分配给 a。

使用

let [b =1, a = b] = [];

它说 a 已经被声明的原因是因为它首先声明 a,然后它试图将 b 分配给它(尚未声明)然后代码错误,但是 a 已经声明

是的,这与时间死区有关 - 实际上是两次。

一期

您正在尝试使用 b 作为 a 初始化之前的默认值。评估从左到右进行,虽然 它们确实按顺序进行了初始化。使用 let [a = 1, b = a] = [] 会起作用。

问题二

在变量声明和初始化之间的全局范围内抛出错误。您可以将测试用例减少到

let a = (_ => { throw; })();

这确实声明了变量a,但从未初始化它,因为之前发生了异常。通常 - 在本地范围内 - 这不是问题,因为此处声明 a 的范围是例外情况。它在全局范围内是不同的——变量永远保持声明但未初始化。 永远死去(时区"forever")。参见