我有一个简单的数组和计数器:
var data = [1];
var i = 0;
快捷赋值产生2:
data[i++] *= 2
// 2
我期待的是 3. data[i++] 乘以 2,所以 1 * 2 是 2,然后它被赋值给 data[i++],现在变成 2,然后在声明后评估 + 的副作用+ 使 i 为 3。
以下也给了我意想不到的结果。它产生 NaN 很奇怪。
var data [1];
var i = 0;
data[i++] = data[i++] * 2;
// NaN
我再次期待 3。 data[i++] 首先计算为 1,然后乘以 2,然后将 2 的值赋给 data[i++] 中的 i,然后在语句完成后递增,使其为 3。
我在这里错过了什么?
最佳答案
var data [1];
不是有效的 JavaScript。您是说var data = [1];
吗?data[i++] *= 2
计算如下:i++
,因为最里面的表达式最先解析:它的值为i
(即0
),而i
之后递增到1
。data[0]
被查找,并乘以二;因为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
)。
一般来说,强烈建议避免在同一表达式中使用两个递增/递减运算符。不同的语言(实际上,同一语言的不同编译器)对于应该做什么有着截然不同的想法。在许多语言中,它在语言规范中被声明为“未定义的行为”。
关于javascript - 具有速记赋值的后增量运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29529612/