JavaScript使用对象执行时髦的自动转换:
var o = {toString: function() {return "40"; }};
print(o + o);
print((o+1)+o);
print((o*2) + (+o));
将打印:
4040
40140
120
这是因为+,如果任何参数是对象/字符串,将尝试将所有参数转换为字符串然后连接它们。如果所有参数都是数字,则将它们加在一起。 *和一元+使用toString将对象转换为数字(以及valueOf,此处未显示)。
JavaScript为++运算符做了什么?
答案 0 :(得分:4)
来自ECMAScript Language Specification
11.3后缀表达式
<强>语法强>
PostfixExpression:
- LeftHandSideExpression
- LeftHandSideExpression [此处没有LineTerminator] ++
- LeftHandSideExpression [此处没有LineTerminator] -
11.3.1 Postfix Increment Operator
生产 PostfixExpression: LeftHandSideExpression [没有 这里的LineTerminator] ++ 被评估 如下:
- 评估LeftHandSideExpression。
- 调用GetValue(Result(1))。
- 致电ToNumber(结果(2))。
- 使用与+运算符相同的规则将值1添加到Result(3) (第11.6.3节)。
- 调用PutValue(结果(1),结果(4))。
- 返回结果(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;
}
编辑:正如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++;