5

我有一个非常简单的算术运算符,但我不知道为什么它不返回 2。下面的代码返回 1。我认为 x++ 等于 x = x + 1;

代码

var x = 1;
document.write(x++);

但是,如果我按如下方式运行代码,它将按预期返回 2

代码

var x = 1;
document.write(++x);

我究竟做错了什么?

4

3 回答 3

12

PostIncrement(variable++) & PostDecrement(variable--)

当您在变量后使用++or--运算符时,变量的值不会递增/递减,直到计算表达式并返回原始值之后。例如x++转换为类似于以下内容:

document.write(x);
x += 1;

PreIncrement(++variable) & PreDecrement(--variable)

当您在变量之前使用++or--运算符时,变量的值会在计算表达式之前递增/递减并返回新值。例如++x转换为类似于以下内容:

x += 1;
document.write(x);

postincrement 和 preincrement 运算符在 C、C++、C#、Java、javascript、php 中可用,我相信还有其他语言。根据why-doesnt-ruby-support-i-or-i-increment-decrement-operators,Ruby 没有这些运算符。

于 2012-06-27T01:46:08.083 回答
9

我认为x++++x(非正式地)是这样的:

x++

function post_increment(x) {
  return x; // Pretend this return statement doesn't exit the function
  x = x + 1;
}

++x

function pre_increment(x) {
  x = x + 1;
  return x;
}

这两个操作做同样的事情,但它们返回不同的值:

var x = 1;
var y = 1;

x++; // This returned 1
++y; // This returned 2

console.log(x == y); // true because both were incremented in the end
于 2012-06-27T01:53:40.870 回答
4

如果您查看javascript 规范第 70 和 71 页,您可以看到它应该如何实现:

字首:

  1. 令 expr 为计算 UnaryExpression 的结果。
  2. 如果以下条件都为真,则抛出 SyntaxError 异常:72 © Ecma International 2011
    • Type(expr) is Reference 为真
    • IsStrictReference(expr) 为真
    • Type(GetBase(expr)) 是环境记录
    • GetReferencedName(expr) 是“eval”或“arguments”
  3. 设 oldValue 为 ToNumber(GetValue(expr))。
  4. 令 newValue 为将值 1 与 oldValue 相加的结果,使用与 + 运算符相同的规则(参见 11.6.3)。
  5. 调用 PutValue(expr, newValue)。
  6. 返回新值。

或者更简单地说:

  1. 增量值
  2. 返回值

后缀:

  1. 令 lhs 为计算 LeftHandSideExpression 的结果。
  2. 如果以下条件都为真,则抛出 SyntaxError 异常:
    • 类型(lhs)是参考是真的
    • IsStrictReference(lhs) 为真
    • Type(GetBase(lhs)) 是环境记录
    • GetReferencedName(lhs) 是“eval”或“arguments”
  3. 设 oldValue 为 ToNumber(GetValue(lhs))。
  4. 令 newValue 为将值 1 与 oldValue 相加的结果,使用与 + 运算符相同的规则(参见 11.6.3)。
  5. 调用 PutValue(lhs, newValue)。
  6. 返回旧值。

或者更简单地说:

  1. 为 temp 赋值
  2. 增量值
  3. 返回温度
于 2012-06-27T02:20:38.363 回答