【问题标题】:How javascript(ECMAScript) assignment operator worksjavascript(ECMAScript) 赋值运算符的工作原理
【发布时间】:2015-09-27 11:05:56
【问题描述】:

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

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

【问题讨论】:

  • 这有什么奇怪的?你在数组之后控制台记录 i ..
  • 你有奇怪的 for 循环,有 4 个参数。
  • 在循环完成后记录 arr2i 会让事情变得更清晰
  • 你能在没有循环的情况下重复这个行为吗?

标签: javascript assignment-operator


【解决方案1】:

编辑:删除了代码 sn-p,因为问题代码现已修复

现在,您的问题手头的问题不是前缀或后缀表示法,而是 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]

【讨论】:

  • 感谢您的友好回答 :) 我认为 = 运算符从右到左评估值,因为将右值分配给左...这是错误的吗?
  • @AndrewLee 是也不是。它们都是运算符,它们将根据运算符优先级执行。虽然= 具有从右到左的关联性,但++ 只是具有更高的优先级,并将在此之前执行。参考developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
  • 哦,非常感谢。终于明白了:)
【解决方案2】:

如果您的意图是将arr 复制到arr2,则无需遍历每个元素。请改用slice

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

var arr2 = arr.slice();

【讨论】:

  • 这是一个很好的建议,但没有回答问题,应该改为评论。
  • @AndreaCasaccia 您可能想阅读this meta post,它讨论了在类似情况下的处理方式。
  • 没错,我想你应该问他为什么要那样做。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-04-18
  • 1970-01-01
  • 1970-01-01
  • 2010-12-17
  • 2016-08-20
  • 2021-09-09
  • 2018-05-20
相关资源
最近更新 更多