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

时间:2015-07-09 07:52:05

标签: javascript assignment-operator

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

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];'

2 个答案:

答案 0 :(得分:2)

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

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

Mozilla Developer Network所述的完整for语法是

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

带有[final-expression]的注释:

  

在每次循环迭代结束时要计算的表达式。这发生在下一次条件评估之前。通常用于更新或增加计数器变量。

扩展您编辑的有关后缀位置差异的问题:

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]

答案 1 :(得分:-1)

如果您的目的是将arr复制到arr2,则无需迭代每个元素。请改用slice

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

var arr2 = arr.slice();