javascript(ECMAScript) 赋值运算符的工作原理

How javascript(ECMAScript) assignment operator works

我在初始化数组的时候,发现了一个奇怪的情况。

JS代码:

var arr = [1, 2, 3, 4, 5];

for(var i=0, arr2=[]; i < 5; arr2[i] = arr[i++])
    console.log(arr2, i);

输出:

[] 0
[1] 1
[1, 2] 2
[1, 2, 3] 3
[1, 2, 3, 4] 4

arr2 初始化为 [1, 2, 3, 4, 5] 这就是我想要的

看这段代码:

for(var i=0, arr2=[]; i < 5; arr2[i++] = arr[i])
    console.log(arr2, i);

此代码将 arr2 初始化为 [2, 3, 4, 5, undefined]

我认为 ++ 运算符在下一行之前运行,并且两个代码将相同。

但是,它的运作方式不同。为什么会这样?

添加说明

我以为for循环都是这样运行的

var i = 0;
var arr2 = [];
check i < 5
console.log(arr2, i);

arr2[i] = arr[i];
i = i + 1;

check i < 5
....skip

这个想法错了吗?

有什么区别

'arr2[i] = arr[i++];' and
'arr2[i++] = arr[i];'

如果您的目的是将 arr 复制到 arr2,则无需遍历每个元素。使用 slice 代替:

var arr = [1, 2, 3, 4, 5];

var arr2 = arr.slice();

编辑:删除了代码片段,因为问题代码现已修复

现在,您的问题手头的问题不是前缀或后缀表示法,而是 for 循环的表达式(特别是 arr2[i] = arr[i++] 部分)将在 AFTER 循环周期完成后执行。这就是为什么你的 arr2 数组在第一次迭代中是空的,索引都很好,但赋值还没有发生。

根据 Mozilla Developer Network 描述的完整 for 语法是

for ([initialization]; [condition]; [final-expression])
    statement

附注 [final-expression]:

An expression to be evaluated at the end of each loop iteration. This occurs before the next evaluation of condition. Generally used to update or increment the counter variable.

扩展关于后缀位置差异的已编辑问题:

i++ 将在下一次使用后递增 i。因此,假设 i=3 的起始值意味着

arr[i] = arr2[i++] --> arr[3] = arr2[3]

完成后 i 增加到 4

相反,i 在确定 arr 索引后递增,因此在访问 arr2:

时它已经具有递增的值
arr[i++] = arr2[i] --> arr[3] = arr2[4]