以下代码使我很头疼

        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循环

09-25 18:26