以下代码给我带来了很大的麻烦
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调试此代码并在命中断点时在语句-2前面放置一个断点我只是停留在语句-2(永远)而不调试任何代码进一步注意到(几乎每10到15秒之后)索引值i ++会自动增加,甚至没有进一步调试代码(正如我之前所说),我有点完全不知道为什么visual studio debugger会自动增加索引i不让我调试代码的值(即,递归迭代所有索引值),如果i ++ = 3,则停止递增值。
答案 0 :(得分:2)
你的问题是你在语句2中增加了两次。所以乘以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]为null,因为我们现在超过了数组的索引。这评估为NaN,因为2 * null是NaN。
我们的i现在是4,因为我们再次增加,我们的数组是[4,NaN]。我们停止循环,因为i = 4,终止for循环
答案 1 :(得分:1)
声明-1的输出是
[2,4,6]
,这是预期的
是。如果我们展开循环,我们得到
var somearr = [1, 2, 3];
somearr[0] *= 2; // somearr[0] = somearr[0] * 2;
somearr[1] *= 2; // somearr[1] = somearr[1] * 2;
somearr[2] *= 2; // somearr[2] = somearr[2] * 2;
// i (3) is no more smaller than somearr.length (3) after the third iteration
执行语句-2的输出为
[4,NaN]
(与此输出完全混淆)。
实际上somearr
的输出是[4, 2, NaN]
。这是为什么?因为i++
每个身体执行被评估两次。循环现在展开到
var somearr = [1, 2, 3];
somearr[0] = somearr[1] * 2; // 2 * 2
somearr[2] = somearr[3] * 2; // undefined * 2
// i (4) is no more smaller than somearr.length (3) after the second iteration