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

时间:2018-01-12 09:34:44

标签: 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);

myArray++不是拼写错误。如您所见,代码只运行一次。运行一次后,循环终止,myArray变为NaN。

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

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

3 个答案:

答案 0 :(得分:5)

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

我强烈建议您查看&#34; Increment&#34;的文档。 ,第一句话解释了发生了什么:

  

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

有人会认为Increment operator ++的行为如下:

myArray++ ---&gt; 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"

您可以假设它将string分配回myArray,当increment operator中的for loop评估时,它确定该值不是数字,因此{当条件NaN评估为for loop时,{2}}和i<NaN在第二次迭代之前退出。试试吧:

false

但是这并不完全正确(我根据var a = "a"; a++; NaN 实际做了什么而搞砸了,而且了解它是什么更好#&# 39; s实际发生了)。查看Postfix Increment运算符的实际规范,我们得到以下结果:

<强>步骤

myArray++

  1. lhs = myArray++
  2. oldValue = myArray

    oldValue = NaN

  3. newValue = Number(myArray) + 1

    newValue = oldValue + 1

    newValue = NaN

  4. NaN
  5. myArray = NaN运算符返回 oldValue Postfix Increment,现在NaN
  6. 所以,在myArray=NaN运算符运行的第一次迭代后,您在for loop中最终得到的结果是:

    Postfix 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 以值myArray结束。

    在这里尝试一些有趣的事情,看看你是否理解为什么在这个无限循环中你的NaN保持为myArray[...]第二次电话会议后counter

    NaN

    <强>答案

    您获得无限循环,因为您的表达式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. } 将始终评估为i<myArray.length,因为永远不会修改True。同时,i将在第一次迭代后转到counter,因为帖子开头已经解释过了。 NaN保持冷静,因为myArray已在Postfix Increment完成。 为什么这个循环迭代但是你做的那个,不是吗?因为在您所做的那个中,您最终将counter的值更改为myArray,迫使循环中的表达式NaN ---&gt;第一次迭代后i<NaN.lengthi<undefined,导致循环退出。

答案 1 :(得分:4)

根据{strong>后缀增量运算符

spec
  
      
  1. 让oldValue为ToNumber(GetValue(lhs))。
  2.   

var myArray = [0,1,2,3,4,5,6,7,8,9];
Number(myArray) //NaN

因此myArray++ =&gt;的的NaN

<强>演示

&#13;
&#13;
var myArray = [0,1,2,3,4,5,6,7,8,9];
console.log( "Just increment using postfix operator ", myArray++ );

myArray = [0,1,2,3,4,5,6,7,8,9];
console.log( "Number conversion ", Number(myArray) );
&#13;
&#13;
&#13;

答案 2 :(得分:2)

执行++并且变量不是类型编号时,将使用toString将其转换为字符串,然后转换为数字。

Object.toString返回[object Object],因此Number('[object Object]')会返回NaN

同样,++ +=myArray++的简写,因此myArray = myArray + 1;等于myArray。现在你的undefined不是一个数组,它没有属性长度,它返回Array.toString因为JS中的所有内容都是一个对象)并且循环中断。

正如@ barmar正确指出的那样,array.join会返回Number("0,1,2...")。所以它等于,。由于逗号(NaN)不是有效的数字字符,因此它返回NaN。此外,当值与false进行比较时,它会返回var myArray = [0,1,2,3,4,5,6,7,8,9]; console.log(myArray.toString()) console.log(Number(myArray.toString())) console.log(1<NaN),从而打破循环。

<强>示例:

{{1}}