JavaScript如何处理++运算符?

时间:2008-12-22 11:36:02

标签: javascript operators type-conversion coercion

JavaScript使用对象执行时髦的自动转换:

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

将打印:

4040
40140
120

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

JavaScript为++运算符做了什么?

3 个答案:

答案 0 :(得分:4)

来自ECMAScript Language Specification

  

11.3后缀表达式

     

<强>语法

     

PostfixExpression:

     
      
  • LeftHandSideExpression
  •   
  • LeftHandSideExpression [此处没有LineTerminator] ++
  •   
  • LeftHandSideExpression [此处没有LineTerminator] -
  •   
     

11.3.1 Postfix Increment Operator

     

生产 PostfixExpression:   LeftHandSideExpression [没有   这里的LineTerminator] ++ 被评估   如下:

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

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

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

编辑:正如mikesamuel所说:它不是parseInt。更新以反映这一点。

答案 1 :(得分:3)

以下代码很好地说明了这一点:

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

一元加上将对象转换为数字而不会修改它。 a ++首先将对象转换为数字,然后返回该数字,然后递增数字,将值存储在a。

这与另一种可能的解决方案相反,其中++首先返回对象,然后转换为数字和增量。

答案 2 :(得分:1)

++运算符执行“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++;