可能重复:
++someVariable与Javascript 中的someVariable++
我很难理解增量运算符。此运算符使其操作数递增(加一(并返回一个值。我在操作数(x++(后面使用了它的后缀和运算符,所以它在递增之前返回值。
因此,如果x是3,那么语句y=x++将y设置为3,并将x递增为4
var x = 3;
var y = x++;
console.log(x); // 4
console.log(y); // 3
我不明白为什么y
不保持值4,而是设置为3,以及为什么x
在被分配值3时保持值4。
post-递增运算符在取其值后递增。这就是它与递增前运算符不同的地方。
var y = x++;
是这两种陈述的简写(按顺序(:
var y = x;
x = x + 1;
如果你想让y等于4,你可以这样做:
var y = ++x;
简称:
x = x + 1;
var y = x;
通过遵循Alex的评论,问题得到了改进。
假设有一个变量x
,即var x=3
。
案例1当你写:
var y = x++;
然后,完成以下步骤:
- 对变量CCD_ 5进行评估(CCD_
- 变量CCD_ 7被递增(CCD_
- 评估的结果(步骤(1(中发生的(被分配给CCD_ 9(因此将产生CCD_
案例2当你写:var y=++x;
然后,完成以下步骤:
- 变量CCD_ 11被递增(CCD_
- 对变量CCD_ 13进行评估(CCD_
- 评估结果(步骤(2(中发生的(被分配给CCD_ 15(因此将产生CCD_ 16(
在这种情况下,遵循Javascript的运算符优先级是很重要的(例如,请参阅此处的更多信息(。
案例3为了完整起见,正如Alex所观察到的,同样重要的是要认识到,如果CASE1中提供的步骤在同一变量上重复,则变量将递增,然后恢复到初始值,即当您写入:
x = x++;
然后,完成以下步骤:
- 对变量CCD_ 17进行评估(CCD_
- 变量CCD_ 19被递增(CCD_
- 评估结果(步骤(1(中发生的(被分配给CCD_ 21(因此将产生CCD_ 22(
来自MDN文档-算术运算符
++(增量(
增量运算符的使用如下:
var++或++var
此运算符将其操作数递增(加一(,并返回价值如果使用后缀,在操作数后面加运算符(例如,x++(,则返回递增之前的值。如果使用前缀如果运算符在操作数之前(例如,++x(,则返回递增后的值。
例如,如果x是3,则语句y=x++将y设置为3,并且将x递增到4。如果x是3,则语句y=++x使x递增将y设置为4。
变量后的++
是增量后运算符,意味着在读取变量后执行增量。
请参阅:http://en.wikipedia.org/wiki/Increment_and_decrement_operators
x++
是*post*增量运算符。它相当于:
var tmp = x;
x = x + 1;
return tmp;
这是旧C时代遗留下来的,人们喜欢写这样的代码:
while(*dest++ = *src++);
(转换:将内存范围复制到第一个0字节(。还有一个*pre*递增运算符++ x
,它先递增,然后返回递增的结果。
增加有两种方法
var y = x++; // first make the allocation then the increasing
// and
var y = ++x; // first make the increasing then the allocation
x++
的增量发生在生成x值的临时副本并返回临时副本之后。相反的是++x,这是一个增量,并返回新值:
var x = 3;
var y = ++x; // y === 4
ECMA 5.1:报价
PostfixExpression:LeftHandSideExpression LeftHandSideExpression[no此处为LineTerminator]++LeftHandSideExpression[无LineTerminator此处]-70©Ecma International 2011
11.3.1 Postfix增量运算符生产PostfixExpression:LeftHandSideExpression[此处无LineTerminator]++计算为如下所示:1.设lhs是对LeftHandSideExpression求值的结果。2.如果满足以下所有条件,则引发SyntaxError异常true:Type(lhs(is Reference is trueIsStrictReference(lhs(为真的类型(GetBase(lhs((是环境记录GetReferencedName(lhs(是"eval"或"arguments"3。Let oldValue为ToNumber(GetValue(lhs((。4.设newValue为加法的结果将值1转换为oldValue,使用与+运算符相同的规则(见11.6.3(.5。调用PutValue(lhs,newValue(。6.返回oldValue。
var y = x++;
意味着x
被递增,并且y
被分配了x
的递增值。
var y = ++x;
意味着x
被递增,并且y
被分配了x
的预递增值。