JavaScript 对对象进行时髦的自动转换:

var o = {toString: function() {return "40"; }};
print(o + o);
print((o+1)+o);
print((o*2) + (+o));

将打印:

4040
40140
120

这是因为,如果任何参数是对象/字符串,+ 将尝试将所有参数转换为字符串,然后连接它们。如果所有参数都是数字,它将它们加在一起。* 和一元 + 使用 toString (以及 valueOf,此处未显示)将对象转换为数字。

JavaScript 对 ++ 运算符有何作用?

有帮助吗?

解决方案

ECMAScript 语言规范

11.3 后缀表达式

句法

后缀表达式:

  • 左手边表达
  • LeftHandSideExpression [此处没有 LineTerminator] ++
  • LeftHandSideExpression [此处没有 LineTerminator] --

11.3.1 后缀增量运算符

生产 后缀表达式:Lefthandside Expextress [在这里无固定器] ++ 评估如下:

  1. 评估 LeftHandSideExpression。
  2. 调用 GetValue(结果(1))。
  3. 调用 ToNumber(结果(2))。
  4. 使用与 +运算符相同的规则(第11.6.3节),将值1添加到结果(3)。
  5. 调用 PutValue(结果(1),结果(4))。
  6. 返回结果(3)。

这是 postInc 工作原理的伪 javascript 代码:

function postInc(a) {
  var x = +a; // Converts a to a number, Section 11.4.6 Unary + Operator
  a = x + 1;
  return x;
}

编辑:作为 迈克萨缪尔 说:它不是 parseInt。已更新以反映这一点。

其他提示

下面的代码说明了这一良好:

var a = {toString: function() {return "40"; }};
nl(typeof a);
nl(typeof +a);
nl(typeof a);
nl(typeof (a++));
nl(a);
nl(typeof a);

的输出是:

object
number
object
number
41
number

一元加号的对象转换为一个数字,并且不对其进行修改。一个++第一对象转换为一个数字,,然后返回该数,然后然后递增的数量,存储在值。

此相对另一可能的解决方案,其中一个++将第一返回对象,然后执行转换成数字并递增。

++操作者做了“toNumber”转换(基本上是的类型的规则组合和的valueOf功能)。基本上任何解决表达

 resolveExpression++

由JS引擎所采取的步骤是

 <temp> = toNumber(resolveExpression);
 resolveExpression = <temp> + 1;
 <result> = <temp>

有关非原子解析表达式,例如。 base.resolve++base["resolve"]++base解决只有一次,然后再利用。在任何理智情况下,这是无关紧要的,但它是重要的,如果递增的值是与实施的valueOf改变基础对象的对象。

例如

base = {};
base.value = {valueOf:function(){base = {}; return 5;}}
base.value++;
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top