一个非常简单的问题,但我无法在任何地方找到答案.请检查以下代码.
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++不是拼写错误.是的,起初这是一个错字.这就是我想出来的方式但是这不是我在这里遇到的问题.我添加了完整的循环,因为我想显示我想出这个错误的地方.
编辑:我已经修正了一些(可耻的)误解,就增量操作数的作用而言.我没有查找实际的文档也犯了同样的错误.我希望这有助于其他用户不会犯同样的错误.(谢谢你指出@ 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 operator在for loop计算中,它确定值不是数字,因此NaN,并且for loop当条件i<NaN评估时,在第二次迭代之前退出false.试试看:
var a = "a";
a++;
NaN
Run Code Online (Sandbox Code Playgroud)
但这并不是完全正确的(我根据myArray++实际做的事情搞砸了,最好还是了解它实际发生了什么).查看Postfix Increment运算符的实际规范,我们得到以下结果:
脚步
myArray++
myArrayoldValue =Number(myArray)
oldValue = NaN
newValue = oldValue+ 1
newValue = NaN+ 1
newValue =NaN
myArray = NaNPostfix Increment操作符返回属性oldValue,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
Run Code Online (Sandbox Code Playgroud)
我希望这有助于清除在每个步骤和循环的一部分中发生的事情,以及为什么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.
}
Run Code Online (Sandbox Code Playgroud)
回答
你得到了无限循环,因为你的表达式i<myArray.length总是会被评估,True因为i它永远不会被修改.同时,由于在帖子开头解释的内容,counter将NaN在第一次迭代后进行.myArray因为Postfix Increment完成了所以保持冷静counter.为什么这个循环迭代但是你做的那个,不是吗?因为你做了一个你最终改变的值myArray到NaN强制循环中的表达i<NaN.length---> i<undefined是false第一次迭代后,引起循环退出.
| 归档时间: |
|
| 查看次数: |
62 次 |
| 最近记录: |