Javascript 带速记赋值的增量后运算符

Javascript 带速记赋值的增量后运算符,javascript,Javascript,我有一个简单的数组和计数器: var data = [1]; var i = 0; 快捷方式指定将生成2: data[i++] *= 2 // 2 我期待着3点。数据[i++]乘以2,所以1*2是2,然后分配给数据[i++],现在它变成了2,然后在对语句求值后,++的副作用使i变成3 下面也给了我意想不到的结果。奇怪的是,它产生了NaN var data [1]; var i = 0; data[i++] = data[i++] * 2; // NaN 我又期待着3点。数据[i++]首先计

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

var data = [1];
var i = 0;
快捷方式指定将生成2:

data[i++] *= 2
// 2
我期待着3点。数据[i++]乘以2,所以1*2是2,然后分配给数据[i++],现在它变成了2,然后在对语句求值后,++的副作用使i变成3

下面也给了我意想不到的结果。奇怪的是,它产生了NaN

var data [1];
var i = 0;
data[i++] = data[i++] * 2;
// NaN
我又期待着3点。数据[i++]首先计算为1,然后乘以2,然后将2的值分配给数据[i++]中的i,在语句完成后,该值将递增,使其为3

我错过了什么

var数据[1];不是有效的JavaScript。您的意思是var数据=[1]

数据[i++]*=2的计算如下:

i++,作为最里面的表达式首先解析:其值为i.e.0,然后i递增为1

查找数据[0],并乘以2;因为数据[0]是1,所以数据[0]被赋值为1*2,即2

返回最外层表达式的值:2++只增加应用于i的值,而不是整个表达式

数据[i++]=数据[i++]*2的计算结果如下:

第一个i++的计算结果为0,并将i修改为1,如前所述

第二个i++计算为1,并将i修改为2

然后,表达式的计算结果为数据[0]=数据[1]*2。数据[1]未定义,未定义*2不是数字

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

var数据[1];不是有效的JavaScript。您的意思是var数据=[1]

数据[i++]*=2的计算如下:

i++,作为最里面的表达式首先解析:其值为i.e.0,然后i递增为1

查找数据[0],并乘以2;因为数据[0]是1,所以数据[0]被赋值为1*2,即2

返回最外层表达式的值:2++只增加应用于i的值,而不是整个表达式

数据[i++]=数据[i++]*2的计算结果如下:

第一个i++的计算结果为0,并将i修改为1,如前所述

第二个i++计算为1,并将i修改为2

然后,表达式的计算结果为数据[0]=数据[1]*2。数据[1]未定义,未定义*2不是数字

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


使用++i代替i++。在您的例子中,首先返回i,然后递增,同时查找递增,然后返回。

使用++i代替i++。在您的例子中,您首先返回i,然后递增,同时查找递增,然后再返回。

在var数据[1]中是否缺少一个=符号;所以它变成了var data=[1]@格雷格尔写这个问题时,那是个打字错误。当然,虽然它在我的测试中也存在。i++首先返回i,然后向i添加1。所以数据[i++]首先分配数据[0],然后我变为1。在var数据[1]中是否缺少一个=符号;所以它变成了var data=[1]@格雷格尔写这个问题时,那是个打字错误。当然,虽然它在我的测试中也存在。i++首先返回i,然后向i添加1。所以data[i++]首先分配data[0],然后i变成1。