为什么解构赋值的右侧会忽略其左侧的索引增量
Why the right side of a destructuring assignment ignores an index increment made in its left part
由于后缀 ++
存在于语言中,以下将始终使 v[0] ← v[1]
:
v = [8, 7, 6, 5];
i = 0;
v[i++] = v[i];
console.log(v[0]); // gives 7
现在有了解构赋值,情况就不同了——我只能用 Chrome 和 Firefox 测试:
v = [8, 7, 6, 5];
i = 0;
[v[i++]] = [v[i]]; // does "v[0] ← v[0]"
console.log(v[0]); // gives 8
两者都将以 i
预期值 1 结束。我在解构赋值的左侧尝试了许多其他变量赋值之王,但一直以来,这些变量赋值都被右侧忽略了主要的破坏之一。然后在解构之后,新的变量值又回到了那里。为什么?
JavaScript 通常被解释为从左到右,这就是 v[i++] = v[i];
.
中发生的情况
只有在解构赋值中,目标才会在值之后求值,因为对于默认值,求值可能取决于值本身。事先评估 属性 名称可能是可能的,但会更复杂,导致明显的不一致。
无论如何,不要在 属性 名称计算中改变你的变量,这会让 reader 感到困惑,无论你是否知道确切的语义。
由于后缀 ++
存在于语言中,以下将始终使 v[0] ← v[1]
:
v = [8, 7, 6, 5];
i = 0;
v[i++] = v[i];
console.log(v[0]); // gives 7
现在有了解构赋值,情况就不同了——我只能用 Chrome 和 Firefox 测试:
v = [8, 7, 6, 5];
i = 0;
[v[i++]] = [v[i]]; // does "v[0] ← v[0]"
console.log(v[0]); // gives 8
两者都将以 i
预期值 1 结束。我在解构赋值的左侧尝试了许多其他变量赋值之王,但一直以来,这些变量赋值都被右侧忽略了主要的破坏之一。然后在解构之后,新的变量值又回到了那里。为什么?
JavaScript 通常被解释为从左到右,这就是 v[i++] = v[i];
.
只有在解构赋值中,目标才会在值之后求值,因为对于默认值,求值可能取决于值本身。事先评估 属性 名称可能是可能的,但会更复杂,导致明显的不一致。
无论如何,不要在 属性 名称计算中改变你的变量,这会让 reader 感到困惑,无论你是否知道确切的语义。