当我初始化一个数组时,我发现了一个奇怪的情况。
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];'
答案 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();