为什么以下语句中变量名后的速记算术运算符 ++ 不返回 2?

IT技术 javascript
2021-02-28 20:51:53

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

代码

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

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

代码

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

我究竟做错了什么?

3个回答

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

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

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

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

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

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

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

我认为你有它倒退。++before 就地增加变量。
2021-04-19 20:51:53
抱歉,您after的声明是什么意思那么 x++ 与 x = x + 1 不一样吗?
2021-04-23 20:51:53
“在语句执行后”对我来说听起来很可疑。后缀运算符的增量发生在将值赋予表达式之后。x = 1; x++ * x++会给 2。
2021-05-06 20:51:53
@nhahtdh 在您看来,被评估为更好的术语吗?
2021-05-08 20:51:53
@Josh Mein - 你能详细说明你的意思it is not incremented until after the statement is executed吗?
2021-05-09 20:51:53

我认为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

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

字首:

  1. 让 expr 是计算 UnaryExpression 的结果。
  2. 如果以下条件全部为真,则抛出 SyntaxError 异常:72 © Ecma International 2011
    • Type(expr) is 引用为真
    • IsStrictReference(expr) 为真
    • Type(GetBase(expr)) 是环境记录
    • GetReferencedName(expr) 是“eval”或“arguments”
  3. 令 oldValue 为 ToNumber(GetValue(expr))。
  4. 使用与 + 运算符相同的规则(参见 11.6.3),让 newValue 成为将值 1 添加到 oldValue 的结果。
  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. 使用与 + 运算符相同的规则(参见 11.6.3),让 newValue 成为将值 1 添加到 oldValue 的结果。
  5. 调用 PutValue(lhs, newValue)。
  6. 返回旧值。

或者更简单:

  1. 给温度赋值
  2. 增量值
  3. 返回温度