const [a, b] = [1, 2]
// expected to be equal to
// const a = 1
// const b = 2
const [c, d] = [3, 4]
// expected to be equal to
// const c = 3
// const d = 4
[a, b] = [b, a]
// expected Assignment to constant variable error
console.log(a, b, c, d)
// => 1, 2, 2, 1
有人可以解释这段代码有什么问题吗?变量c和d发生了什么?
答案 0 :(得分:4)
您没有使用分号,并且ASI并不总是按照您希望的方式工作。
您的代码与此等效:
const [a, b] = [1, 2];
const [c, d] = [3, 4][a, b] = [b, a];
console.log(a, b, c, d);
在这种情况下,
[3, 4][a, b]
的值为[3,4][2]
,因为第二个逗号只是逗号运算符和b === 2
。这使得赋值等效于[3,4][2] = [b,a]
,这将导致创建临时数组[3,4,[2,1]]
,然后将赋值表达式[2,1]
的结果赋给[c,d]
。
尝试添加分号,您将获得预期的结果:
const [a, b] = [1, 2];
// expected to be equal to
// const a = 1
// const b = 2
const [c, d] = [3, 4];
// expected to be equal to
// const c = 3
// const d = 4
[a, b] = [b, a];
// expected Assignment to constant variable error
console.log(a, b, c, d);
答案 1 :(得分:1)
使用分号(;
)不能正确终止命令,基本上是一个问题。如果将它们添加到每个命令的末尾,您将获得正确的结果..并且还遇到无法将a
和b
声明为const
的问题。
答案 2 :(得分:-3)
代替:
const [a, b] = [1, 2];
尝试:
const a = 1, b = 2;
const c = 3, d = 4;
要交换值,请尝试以下操作:
var temp;
temp = a; a = b; b = temp;