带有操作的JavaScript赋值* = conundrum

时间:2015-06-28 22:01:41

标签: javascript

以下代码给我带来了很大的麻烦

        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,则停止递增值。

2 个答案:

答案 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