2011-11-14 141 views
6

当我在JavaScript中真值表瞎搞,我注意到,以下计算结果为true:为什么{} <function(){}?

var a, b, c; 
a = {}; 
b = function(){}; 
c = a < b; 
console.log(c); 

为什么?

我只在Firefox中测试过,我确信我可以挖掘ECMAScript 2.6.2规范中的细节,但TBH我感觉很懒。

+1

这是更大的在Chrome中也是如此。 – jer

+0

看起来它可能只是比较对象的地址。如果你可以自信地推测实体'a'和'b'的性质,那么你可能不会发现这种可怕的......但我当然不能:-) –

+1

downvoter care care to comment? – zzzzBov

回答

17

的JavaScript类型强制使本质上比较

String({}) < String(function(){}) 

所以基本上你只是在做

"[object Object]" < "function(){}" 

这是一个字典字符串比较。

+5

参见[ECMA-262](http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-262.pdf),第11.8.5节 – NullUserException

+4

或[本11.8.5](http: //es5.github.com/#x11.8.5)如果你不想通过PDF进行浏览。 –

8

Javascript compares objects致电valueOf()toString()
由于这两个操作数都没有valueOf()方法,所以它会比较toString()

({}).toString()[object Object]
(function() { }).toString()function() { }

[小于f

4
alert(({}))   -> [object Object] 
alert((function(){})) -> function() {} 

[f之前,因此({}) < (function() {})

是的,这很愚蠢。 )

0

非常简单和容易的(内部它们都转换为字符串),这是因为在Javascript

如果对象与数字或字符串进行比较,JavaScript的尝试返回的默认值目的。运算符尝试使用对象的valueOf和toString方法将对象转换为原始值(字符串或数值)。

所以当两个被比较两个对象所使用的内部ToString方法转换成字符串

a.toString() 
"[object Object]" 

b.toString() 
"function() { }" 

因此B将被比(较大的字符串) 这就是为什么B> A为真

相关问题