理解由 Babel 转译的 ES6 到 ES5 代码

Understanding ES6 to ES5 code as transpiled by Babel

Babel 转译以下 ES6 代码

test(){
    var list = [ 1, 2, 3 ]
    var [ a, , b ] = list
    [ b, a ] = [ a, b ]
  }

进入这个

function test() {
      var list = [1, 2, 3];

      var _list = list[(b, a)] = [a, b];

      var _list2 = _slicedToArray(_list, 3);

      var a = _list2[0];
      var b = _list2[2];
    }

我无法理解这行代码到底发生了什么

var _list = list[(b, a)] = [a, b];

具体来说,我对列表[(b, a)]一窍不通。非常感谢任何帮助?

简短的回答是

var [ a, , b ] = list
[ b, a ] = [ a, b ]

相同
var [ a, , b ] = list[ b, a ] = [ a, b ]

因为自动分号插入不适用于这种情况。同样的情况适用于这个 ES5 示例:

var list = [1, 2, 3]
var value = list
[1]
console.log(value);

如果你 运行 这段代码,它会记录 2,而不是 [1, 2, 3] 因为索引被应用到前一行,而不是被视为下一行的数组.

自动分号插入通常适用于解析器遇到语法错误、后退一步并在插入分号后尝试的情况。

在这两种情况下,下一行的内容作为上一行的一部分是完全有效的,因此没有自动分号。

在您的示例中,list[a, b] 被解析为使用逗号运算符操作的结果访问索引,这实际上将计算为 list[b]。逗号运算符一次处理一个表达式列表,然后最终计算出最后一个表达式的结果。