以下代码使我很头疼
var somearr = [1, 2, 3];
function operations() {
for (var i = 0; i < somearr.length;) {
//alert (somearr[i++] *= 2); // statement-1
alert(somearr[i++] = somearr[i++] * 2); //statement-2
}
}
operations();
从概念上讲,statement-1和statement-2是相同的(请参见上面的代码中的注释)。我知道somearr [i ++]在statement-1中被评估一次,在statement-2中被评估两次。但是我不明白的是,语句1的输出(在递归迭代之后)是[2,4,6],这是预期的,但是递归执行的语句2的输出是[4,NaN](与此输出)。
最重要的是,当我尝试使用Visual Studio调试此代码并在遇到断点时在statement-2前面放置一个断点时,我一直停留在statement-2(永远),而无需进一步调试代码,并且注意到(几乎每10到15秒之后)该索引值i ++会自动增加,而无需进一步调试代码(如我之前所说),我有点kind异,Visual Studio调试器如何在不让我调试的情况下自动增加索引i值代码(即递归地迭代所有索引值),如果i ++ = 3,则一旦该值停止递增。
最佳答案
您的问题是,您在语句2中将i递增两次。因此,将其乘以null(这是在未在数组中拉索引时得到的结果)将返回NaN。
最佳做法是像这样在for循环内递增:
for (var i = 0; i < somearr.length; i++) {
//somearr[i] *= 2; // statement-1
//somearr[i] = somearr[i] * 2; //statement-2
}
现在这两个语句都可以工作。
您的代码如下:
for (var i = 0; i < somearr.length;) {
somearr[i++] = somearr[i++] * 2;
}
在执行时,我们评估somearr [i ++]:
i = 0,somearr [0] = 1
我们将其设置为等于somearr [1] * 2(因为我们在第一次评估后就递增了,所以为somearr [1])。
因此,somearr的第一个索引变为4,并且由于我们再次增加,因此i当前设置为2。
现在我们检查somearr [2],它得到3。我们将此值设置为等于somearr [3] *2。但是somearr [3]为空,因为我们现在经过了数组的索引。因为2 * null是NaN,所以计算结果为NaN。
我们的i现在为4,因为我们再次增加了,数组为[4,NaN]。我们停止循环,因为i = 4,这终止了for循环