问大家一个问题,这是如何分析的?

cra*_*ane 5 javascript

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将变成一个数组.为什么是这样?

在此输入图像描述

Nic*_*wer 5

自动分号插入有一些怪癖,这就是其中之一.在你的第一个例子中,在第二行的末尾不会插入分号,因此它会像这样读取解析器:

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