let a = 1
let b = 2
[a, b] = [b, a]
console.log(a)
console.log(b)Run Code Online (Sandbox Code Playgroud)
让b = 2(没有分号)会出错:

2.
let a = 1
let b = 2
let c = 3
[a, b] = [b, a]
console.log(a)
console.log(b)
console.log(c)Run Code Online (Sandbox Code Playgroud)
让c = 3没有分号,没有错误,c将变成一个数组.为什么是这样?

自动分号插入有一些怪癖,这就是其中之一.在你的第一个例子中,在第二行的末尾不会插入分号,因此它会像这样读取解析器:
let b = 2[a, b] = [b, a];
Run Code Online (Sandbox Code Playgroud)
这引发了一个异常,因为b尚不存在,但它正试图用来定义自己.示例2看起来类似,但现在指的是已经存在的变量,因此您只需要一个非常奇怪的代码片段而不是异常:
let c = 2[a, b] = [b, a];
Run Code Online (Sandbox Code Playgroud)
至于这意味着什么,首先让我们来看看2[a, b].数字被装箱到对象,因此可以访问它们的属性.这就是为什么,例如,您可以执行以下操作:
let temp = 2;
console.log(temp.toString());
Run Code Online (Sandbox Code Playgroud)
temp是一个数字对象,它上面有一个toString属性.现在,因为.字符对数字具有特殊含义(它是小数点),所以不能将它与数字文字一起使用,因此类似下面的内容是非法的:
2.toString();
Run Code Online (Sandbox Code Playgroud)
但是使用括号语法很好,如:
2['toString']()
Run Code Online (Sandbox Code Playgroud)
我们所拥有的括号语法是2[a, b]:它试图访问2.属性?2 [b],解析为2 [2].它a与奇怪的逗号运算符一起使用,基本上被忽略了.
什么是2 [2]?没什么,只是一个属性undefined.如果你试图分配它,那么就不会发生任何注意事项,因为数字不允许你像这样修改它们的属性.但是如果你愿意的话,你仍然可以尝试分配它,它会默默地失败(无论如何都是非严格的模式).
总结一下2[a, b] = [b, a];:它创建一个包含元素的数组[b, a],然后尝试将其分配给2 [2].这对数字2没有任何作用,但是您尝试分配的值确实成为表达式的结果,因此结果2[a, b] = [b, a];只是[b, a],即[2, 1].由于代码,这又被分配给clet c = //etc