编辑:我已经修正了一些关于增量操作数的作用的(可耻的)误解。我犯了同样的错误,没有查找实际的文档。我希望这可以帮助其他用户不要犯同样的错误。 (感谢您指出这一点@gurvinder372。)
我强烈建议您查找“增量 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Arithmetic_Operators”,第一句话解释了发生了什么:
增量运算符增加其操作数(加一)并返回一个值。
人们会认为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"
你可以假设它分配了一个string
回到myArray
, when increment operator
in the for loop
评估,它确定 value 不是数字,因此NaN
, and for loop
当条件满足时,在第二次迭代之前退出i<NaN
评估为false
。试试看:
var a = "a";
a++;
NaN
But 这不完全正确(我搞砸了myArray++
实际上是在幕后做的,最好了解它实际发生的情况)。查看实际规格后缀增量 http://www.ecma-international.org/ecma-262/6.0/#sec-postfix-increment-operator-runtime-semantics-evaluation运算符,我们得到以下结果:
Steps
myArray++
-
lhs =
myArray
-
oldValue = Number(myArray)
oldValue = NaN
-
newValue = oldValue
+ 1
newValue = NaN
+ 1
newValue = NaN
myArray = NaN
- The
Postfix 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
我希望这有助于澄清循环的每个步骤和部分中发生的情况以及原因myArray
最终获得价值NaN
.
这里有一些有趣的事情可以尝试一下,看看你是否明白其中的原因infinite循环你的myArray
留下来[...]
but counter
is 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.
}
Answer
你会得到无限循环,因为你的表达式i<myArray.length
将始终评估为True
since i
从未被修改。同时,counter
将会去NaN
由于帖子开头所解释的内容,在第一次迭代之后。myArray
保持凉爽,因为Postfix Increment
完成于counter
。
为什么这个循环会迭代,而你所做的循环却不会?因为在你所做的那件事中你最终改变了myArray
into NaN
强制循环中的表达式i<NaN.length
---> i<undefined
to be false
第一次迭代后,导致循环退出。