一个非常简单的问题,但我无法在任何地方找到答案。请检查以下代码。
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++
不是拼写错误。是的,起初这是一个错字。这就是我想出来的方式但是这不是我在这里遇到的问题。我添加了完整的循环,因为我想显示我想出这个错误的地方。
答案 0 :(得分:5)
我强烈建议您查看&#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++
myArray++
oldValue = myArray
oldValue = NaN
newValue = Number(myArray)
+ 1
newValue = oldValue
+ 1
newValue = NaN
NaN
myArray = NaN
运算符返回 oldValue ,Postfix Increment
,现在NaN
所以,在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.length
为i<undefined
,导致循环退出。
答案 1 :(得分:4)
根据{strong>后缀增量运算符
的spec
- 让oldValue为ToNumber(GetValue(lhs))。
醇>
和
var myArray = [0,1,2,3,4,5,6,7,8,9];
Number(myArray) //NaN
因此myArray++
=&gt;的的NaN 强>
<强>演示强>
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;
答案 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}}