当数组对象在JavaScript中递增时会发生什么?

Ish*_*iri 2 javascript

一个非常简单的问题,但我无法在任何地方找到答案.请检查以下代码.

var myArray = [0,1,2,3,4,5,6,7,8,9];

for(i=0; i < myArray.length; myArray++){
 console.log("Loop iteration step : "+i);
}

console.log("After array increment : " + myArray);
Run Code Online (Sandbox Code Playgroud)

myArray++不是一个错字.如您所见,代码只运行一次.运行一次后,循环终止并myArray变为NaN.

这个阵列发生了什么?阵列如何成为NaN?

PS:好的,更多的信息,因为每个人都很好奇为什么myArray++不是拼写错误.是的,起初这是一个错字.这就是我想出来的方式但是这不是我在这里遇到的问题.我添加了完整的循环,因为我想显示我想出这个错误的地方.

Cha*_*mor 5

编辑:我已经修正了一些(可耻的)误解,就增量操作数的作用而言.我没有查找实际的文档也犯了同样的错误.我希望这有助于其他用户不会犯同样的错误.(谢谢你指出@ gurvinder372.)

我强烈建议你查看" 增量 " 的文档,第一句话解释了发生了什么:

增量运算符递增(加1)其操作数并返回一个值.

人们会认为其Increment operator ++行为如下:

myArray++---> myArray = myArray + 1;

当JavaScript评估时,myArray + 1任何事情都可能发生.在这种情况下,试试吧:

var myArray = [0,1,2,3,4,5,6,7,8,9];
myArray + 1
"0,1,2,3,4,5,6,7,8,91"
Run Code Online (Sandbox Code Playgroud)

你可以假设它然后分配一个string返回myArray,当increment operatorfor loop计算中,它确定值不是数字,因此NaN,并且for loop当条件i<NaN评估时,在第二次迭代之前退出false.试试看:

var a = "a";
a++;
NaN
Run Code Online (Sandbox Code Playgroud)

但这并不是完全正确的(我根据myArray++实际做的事情搞砸了,最好还是了解它实际发生了什么).查看Postfix Increment运算符的实际规范,我们得到以下结果:

脚步

myArray++

  1. lhs =myArray
  2. oldValue =Number(myArray)

    oldValue = NaN

  3. newValue = oldValue+ 1

    newValue = NaN+ 1

    newValue =NaN

  4. myArray = NaN
  5. Postfix Increment操作符返回属性oldValue,NaN现在myArray=NaN

因此,for loopPostfix Increment运算符运行时,您在第一次迭代后最终得到的是:

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

for ([initialization]; i<myArray.length; NaN)
    statement

for ([initialization]; i<NaN.length; NaN)
    statement

for ([initialization]; i<undefined; NaN)
    statement

for ([initialization]; false; NaN)
    statement
Run Code Online (Sandbox Code Playgroud)

我希望这有助于清除在每个步骤和循环的一部分中发生的事情,以及为什么myArray最终会有价值NaN.

下面是一些有趣的尝试,看看你明白为什么在这个无限循环您myArray到达继续担任[...],但counterNaN第二个电话后.

var myArray = [1,2,3,4,5,6,7,8,9];
var counter = myArray;
for(let i=0; i<myArray.length; counter++){
    console.log("Infinite calls. Never leaving and counter is " + counter);
   // i++; if you don't want to eat up that infinite loop.
}
Run Code Online (Sandbox Code Playgroud)

回答

你得到了无限循环,因为你的表达式i<myArray.length总是会被评估,True因为i它永远不会被修改.同时,由于在帖子开头解释的内容,counterNaN在第一次迭代后进行.myArray因为Postfix Increment完成了所以保持冷静counter.为什么这个循环迭代但是你做的那个,不是吗?因为你做了一个你最终改变的值myArrayNaN强制循环中的表达i<NaN.length---> i<undefinedfalse第一次迭代后,引起循环退出.