数组解构-意外行为

时间:2018-12-12 04:01:05

标签: javascript

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发生了什么?

3 个答案:

答案 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)

使用分号(;)不能正确终止命令,基本上是一个问题。如果将它们添加到每个命令的末尾,您将获得正确的结果..并且还遇到无法将ab声明为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;