我有一个简单的数组和计数器:
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。
我在这里缺少什么?
答案 0 :(得分:4)
var data [1];
不是有效的JavaScript。您的意思是var data = [1];
吗?
data[i++] *= 2
评估如下:
i++
,因为最里面的表达式首先解析:它的值为i
(即0
),然后i
递增到1
data[0]
,然后乘以2;由于data[0]
为1
,data[0]
的值为1 * 2
,即2
。
返回最外层表达式的值:2
。 ++
仅增加应用于(i
)的内容,而不是整个表达式。
data[i++] = data[i++] * 2
评估如下:
第一个i++
评估为0
,并像以前一样将i
修改为1
。
第二个i++
评估为1
并将i
修改为2
然后表达式的计算结果为data[0] = data[1] * 2
。 data[1]
为undefined
,undefined * 2
不是数字(NaN
)。
通常,强烈建议避免在同一表达式中使用两个递增/递减运算符。不同的语言(实际上,同一语言的不同编译器)对于应该做什么有着截然不同的想法。在许多语言中,它被声明为"未定义的行为"在语言规范中。
答案 1 :(得分:0)
而不是i++
,请使用++i
。在您的情况下,您首先返回i
,然后递增它,同时查找增量,然后返回。