1. {}+""
相当于+"", 因为js解析器把{} 当做 block表达式。
一元运算符+ 的规则是(http://es5.github.io/index.html#x11.4.6):
-
Let expr be the result of evaluating UnaryExpression.
-
Return ((expr)).
根据标准:
"" ==>GetValue()--> "" ==>ToNumber()----> 0;
1.执行GetValue (http://es5.github.io/index.html#x8.7.1) ,规则如下:
If (V) is not Reference, return V.
因此返回 "";
2. 执行ToNumer(http://es5.github.io/index.html#x9.3):
The MV of StringNumericLiteral ::: [empty] is 0.
根据标准,因此空字符串"" 返回0;
因此 : {}+"" //0;
2. ""+{}
标准中 二元运算符 加法规则如下:
-
Let lref be the result of evaluating AdditiveExpression.
-
Let lval be (lref).
-
Let rref be the result of evaluating MultiplicativeExpression.
-
Let rval be (rref).
-
Let lprim be (lval).
-
Let rprim be (rval).
-
If (lprim) is String or (rprim) is String, then
-
Return the String that is the result of concatenating (lprim) followed by(rprim)
-
-
Return the result of applying the addition operation to (lprim) and(rprim). See the Note below .
"" =ToPrimitive=>"" =ToString=>""
{} =ToPrimitive=>"[object Object]"=ToString=> "[object Object]";
所以结果 ""+{} //[object Object]
备注 :ToPrimitive 如果是普通对象 会调用 对象的 valueOf方法。如果没有如果没有则调用 toString方法. 如果是Date对象,则会调用toString,如果没有则调用valueOf;
相关网址:http://es5.github.io/index.html#x9.1
http://es5.github.io/index.html#x8.12.8