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]
我在初始化数组的时候,发现了一个奇怪的情况。
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]