我正在玩Rhino并注意到这种奇怪的行为似乎是运算符优先级:
js> {}+{}
NaN
js> ''+{}+{}
[object Object][object Object]
js> ''+({}+{})
[object Object][object Object]
我希望表达式''+({}+{})
能够评估为"NaN"
,因为{}+{}
应首先评估,但这不会发生。我在V8和Firefox中对此进行了测试,得到了相同的结果。
为什么Javascript在这种情况下不遵循括号中的标准优先级(4*(1+2)
仍然是预期的12
)?
答案 0 :(得分:6)
普通{}
被视为块语句,因此您的代码实际上是:
{
//empty block
}
+{}; //Convert object to number
我应该解释一下简单的意思:
在语句上下文中表示{}
。 ({})
是一个对象,因为括号不能包含语句,它们只能包含表达式。
答案 1 :(得分:0)
这很简单:
{}
是一个声明,并且:
({})
是一个表达。
只有后者(或强制解释器将大括号视为空对象的任何其他内容)才会生成[object Object]
。