这是因为这部分代码:
let b = a
[a, b] = [b, a]
被解释为:
let b = a[a, b] = [b, a]
这意味着:
let b; // Create variable b.
b = a[b]; // Assign to b the value of property b of a
// for example if the value of b is "hello"
// then b = a.hello. If the value of b is 0
// then b = a[0];
a[b] = [b, a]; // Assign the array containing b and a to
// property b of a. For example if the
// value of b is "hello" then
// a.hello = ["hello", a]
b = a[b]; // Assign the property b of a to b. For example
// if the value of b is originally "hello" then
// b = a.hello
这是为什么?这是因为行尾在 javascript 中的工作方式。该算法称为自动分号插入。在 javascript 中,行尾不是语句的结尾。这允许我们编写多行语句。但是,如果行尾恰好是语句的结尾,那么 javascript 会自动插入分号。
这是如何工作的一个例子。如果 javascript 看到:
let a
let b
它会首先尝试将其解析为:
let a let b
这当然是语法错误。所以javascript会尝试在行尾插入分号并重试:
let a;
let b
这导致它被解析为:
let a; let b
这是有效的语法,所以 javascript 很高兴。
但是,假设你给 javascript 这段代码:
let a
[a, b] = [10 20]
Javascript 会尝试将其解析为:
let a[a, b] = [10 20]
这是有效的语法,因为a[x] 只是访问a 的属性x。但是逗号呢?它仍然是有效的语法。它被称为逗号运算符。逗号运算符是类似于+ 或- 的运算符。逗号运算符的工作方式是:
- 评估逗号左侧然后忽略结果
- 计算逗号右边然后返回结果。
所以代码:
a = 1, 2
等同于:
1
a = 2
这可能看起来完全没用,但有时很有用(只是有时 - 大多数人从未找到它的用途)。但是,它是 javascript 语法的一部分,所以代码:
a[a,b]
是有效的语法。它只是意味着a[b]。
所以 javascript 对你的代码的理解与你不同。
standard.js 项目推广了从 javascript 代码中删除分号。如果您想使用不带分号的 javascript 您必须遵循 STANDARD.JS 规则。否则做我做的,总是使用分号。
您可以在以下位置找到关于如何不使用分号的规则:https://standardjs.com/rules.html#semicolons
它包括如下规则:
切勿以 (、[、` 或其他一些不太可能的可能性开始一行。
Standard.js 希望您这样编写代码:
let a = 1
let b = 2
;[a, b] = [b, a] // <<------- semicolon at start of this line!!
我个人更喜欢在每行末尾看到分号,但这取决于你。