0

可能重复:
++someVariable Vs。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。

4

9 回答 9

4

post -increment 运算符在取值递增。这就是它与预增量运算符的不同之处。

于 2013-01-14T14:30:23.917 回答
2

通过遵循Alex的评论,这个问题得到了改进。

假设有一个变量xsa var x=3

案例1 当你写:

var y = x++;

然后,完成以下步骤:

  1. x评估变量(x为 3);
  2. 变量x递增(x为 4);
  3. 评估的结果(发生在步骤(1)中)被分配给y(因此将结果y=3);

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

然后,完成以下步骤:

  1. 变量x递增(x为 4);
  2. x评估变量(x为 4);
  3. 评估的结果(发生在步骤(2)中)被分配给y(因此将结果y=4);

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

CASE 3 为了完整起见,正如Alex所观察到的,同样重要的是要认识到,如果CASE1中提供的步骤对同一个变量重复,那么变量将递增然后恢复到初始值,即当你写:

x = x++;

然后,完成以下步骤:

  1. x评估变量(x为 3);
  2. 变量x递增(x为 4);
  3. 评估的结果(发生在步骤(1)中)被分配给x(因此将结果x=3);
于 2013-01-14T14:31:52.890 回答
2
var y = x++;

是这两个语句的简写(按顺序):

var y = x;
x = x + 1;

如果您希望 y 等于 4,您将执行以下操作:

var y = ++x;

这是以下的简写:

x = x + 1;
var y = x;
于 2013-01-14T14:33:17.657 回答
1

来自MDN 文档 - 算术运算符

++(增量)

增量运算符的使用如下:

var++ 或 ++var

此运算符将其操作数递增(加一)并返回一个值。如果使用后缀,操作数后面有运算符(例如,x++),则返回递增前的值。如果在操作数之前使用带运算符的前缀(例如 ++x),则返回递增后的值。

例如,如果 x 为 3,则语句 y = x++ 将 y 设置为 3 并将 x 递增至 4。如果 x 为 3,则语句 y = ++x 将 x 递增至 4 并将 y 设置为 4。

于 2013-01-14T14:31:48.257 回答
0

++after 变量是一个后自增运算符,表示在读取变量后执行自增。

见:http ://en.wikipedia.org/wiki/Increment_and_decrement_operators

于 2013-01-14T14:30:24.017 回答
0

x++在制作 x 的值的临时副本并返回临时副本之后发生增量。相反的是 ++x ,它是一个增量并返回新值:

var x = 3;
var y = ++x; // y === 4

来自ECMA 5.1的引用:

PostfixExpression : LeftHandSideExpression LeftHandSideExpression [此处无 LineTerminator] ++ LeftHandSideExpression [此处无 LineTerminator] -- 70 © Ecma International 2011
11.3.1 后缀增量运算符 产生式 PostfixExpression : LeftHandSideExpression [此处没有 LineTerminator] ++ 的计算方法如下: 1. 令 lhs 为计算 LeftHandSideExpression 的结果。2. 如果以下条件全部为真,则抛出 SyntaxError 异常:  Type(lhs) is Reference is true  IsStrictReference(lhs) is true  Type(GetBase(lhs)) is Environment Record  GetReferencedName(lhs) is "eval " 或 "参数" 3. 让 oldValue 为 ToNumber(GetValue(lhs))。4. 使用与 + 运算符相同的规则(参见 11.6.3),让 newValue 为将值 1 与 oldValue 相加的结果。5. 调用 PutValue(lhs, newValue)。6. 返回旧值。

于 2013-01-14T14:30:43.727 回答
0

x++是 * post *increment 运算符。它相当于:

 var tmp = x;
 x = x + 1;
 return tmp;

这是旧 C 时代的遗留物,人们喜欢编写如下代码:

 while(*dest++ = *src++);

(翻译:将内存范围复制到第一个 0 字节)。还有一个 * pre *increment 运算符++ x,它先递增,然后返回递增的结果。

于 2013-01-14T14:31:13.397 回答
0

有两种增加方式

var y = x++; // first make the allocation then the increasing
// and
var y = ++x; // first make the increasing then the allocation
于 2013-01-14T14:31:13.690 回答
0
var y = x++; 

表示x是递增的,并被y赋予 的递增值x

var y = ++x;

表示它x被递增,并被y分配了 的预递增值x

于 2013-01-14T14:31:35.257 回答