具有速记赋值的后增量运算符

时间:2015-04-09 04:11:06

标签: javascript

我有一个简单的数组和计数器:

var data = [1];
var i = 0;

快捷方式分配产生2:

data[i++] *= 2
// 2

我期待3. data [i ++]乘以2,所以1 * 2是2,然后分配给data [i ++],现在变为2,然后在语句后评估+的副作用+使我成为3.

以下也给了我意想不到的结果。它奇怪地产生了NaN。

var data [1];
var i = 0;
data[i++] = data[i++] * 2;
// NaN

我再次期待3。 data [i ++]首先计算为1,然后乘以2,然后将该2值分配给data [i ++]中的i,然后在语句完成后递增,使其为3。

我在这里缺少什么?

2 个答案:

答案 0 :(得分:4)

  • var data [1];不是有效的JavaScript。您的意思是var data = [1];吗?

  • data[i++] *= 2评估如下:

    • i++,因为最里面的表达式首先解析:它的值为i(即0),然后i递增到1

    • 抬起
    • data[0],然后乘以2;由于data[0]1data[0]的值为1 * 2,即2

    • 返回最外层表达式的值:2++仅增加应用于(i)的内容,而不是整个表达式。

  • data[i++] = data[i++] * 2评估如下:

    • 第一个i++评估为0,并像以前一样将i修改为1

    • 第二个i++评估为1并将i修改为2

    • 然后表达式的计算结果为data[0] = data[1] * 2data[1]undefinedundefined * 2不是数字(NaN)。

  • 通常,强烈建议避免在同一表达式中使用两个递增/递减运算符。不同的语言(实际上,同一语言的不同编译器)对于应该做什么有着截然不同的想法。在许多语言中,它被声明为"未定义的行为"在语言规范中。

答案 1 :(得分:0)

而不是i++,请使用++i。在您的情况下,您首先返回i,然后递增它,同时查找增量,然后返回。