增加对JavaScript增量运算符的理解



可能重复:
++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++;

然后,完成以下步骤:

  1. 对变量CCD_ 5进行评估(CCD_
  2. 变量CCD_ 7被递增(CCD_
  3. 评估的结果(步骤(1(中发生的(被分配给CCD_ 9(因此将产生CCD_

案例2当你写:var y=++x;

然后,完成以下步骤:

  1. 变量CCD_ 11被递增(CCD_
  2. 对变量CCD_ 13进行评估(CCD_
  3. 评估结果(步骤(2(中发生的(被分配给CCD_ 15(因此将产生CCD_ 16(

在这种情况下,遵循Javascript的运算符优先级是很重要的(例如,请参阅此处的更多信息(。

案例3为了完整起见,正如Alex所观察到的,同样重要的是要认识到,如果CASE1中提供的步骤在同一变量上重复,则变量将递增,然后恢复到初始值,即当您写入:

x = x++;

然后,完成以下步骤:

  1. 对变量CCD_ 17进行评估(CCD_
  2. 变量CCD_ 19被递增(CCD_
  3. 评估结果(步骤(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 trueIsStrictReference(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的预递增值。

最新更新