我有一个非常简单的算术运算符,但我不知道为什么它不返回 2。下面的代码返回 1。我认为 x++ 等于 x = x + 1;
代码
var x = 1;
document.write(x++);
但是,如果我按如下方式运行代码,它将按预期返回 2
代码
var x = 1;
document.write(++x);
我究竟做错了什么?
我有一个非常简单的算术运算符,但我不知道为什么它不返回 2。下面的代码返回 1。我认为 x++ 等于 x = x + 1;
代码
var x = 1;
document.write(x++);
但是,如果我按如下方式运行代码,它将按预期返回 2
代码
var x = 1;
document.write(++x);
我究竟做错了什么?
当您在变量后使用++
or--
运算符时,变量的值不会递增/递减,直到计算表达式并返回原始值之后。例如x++
转换为类似于以下内容:
document.write(x);
x += 1;
当您在变量之前使用++
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 没有这些运算符。
我认为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 页,您可以看到它应该如何实现:
字首:
- 令 expr 为计算 UnaryExpression 的结果。
- 如果以下条件都为真,则抛出 SyntaxError 异常:72 © Ecma International 2011
- Type(expr) is Reference 为真
- IsStrictReference(expr) 为真
- Type(GetBase(expr)) 是环境记录
- GetReferencedName(expr) 是“eval”或“arguments”
- 设 oldValue 为 ToNumber(GetValue(expr))。
- 令 newValue 为将值 1 与 oldValue 相加的结果,使用与 + 运算符相同的规则(参见 11.6.3)。
- 调用 PutValue(expr, newValue)。
- 返回新值。
或者更简单地说:
后缀:
- 令 lhs 为计算 LeftHandSideExpression 的结果。
- 如果以下条件都为真,则抛出 SyntaxError 异常:
- 类型(lhs)是参考是真的
- IsStrictReference(lhs) 为真
- Type(GetBase(lhs)) 是环境记录
- GetReferencedName(lhs) 是“eval”或“arguments”
- 设 oldValue 为 ToNumber(GetValue(lhs))。
- 令 newValue 为将值 1 与 oldValue 相加的结果,使用与 + 运算符相同的规则(参见 11.6.3)。
- 调用 PutValue(lhs, newValue)。
- 返回旧值。
或者更简单地说: