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

标签 javascript

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

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] * 2data[1]undefined,并且 undefined * 2 不是数字 (NaN)。

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

关于javascript - 具有速记赋值的后增量运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29529612/

相关文章:

JavaScript 从变量 getElementById

javascript - 在 rails : No route matches [GET] error 中引用外部 css

javascript - Node.js Promise 在没有被调用的情况下运行

javascript - 如何在浏览器中将 JSON 对象编辑为表单

javascript - postman 和浏览器对我的中间件有不同的行为

javascript - call() 在其自己的上下文中的函数

javascript - indexOf() 在 Angular2 中的 *ngIf 语句内创建 "cannot read property"错误

javascript - 如何显示隐藏类(class)?

javascript - 按图像计数变量显示图像列表

javascript - AngularJS 单选按钮没有绑定(bind)