当我在JavaScript中真值表瞎搞,我注意到,以下计算结果为true:为什么{} <function(){}?
var a, b, c;
a = {};
b = function(){};
c = a < b;
console.log(c);
为什么?
我只在Firefox中测试过,我确信我可以挖掘ECMAScript 2.6.2规范中的细节,但TBH我感觉很懒。
当我在JavaScript中真值表瞎搞,我注意到,以下计算结果为true:为什么{} <function(){}?
var a, b, c;
a = {};
b = function(){};
c = a < b;
console.log(c);
为什么?
我只在Firefox中测试过,我确信我可以挖掘ECMAScript 2.6.2规范中的细节,但TBH我感觉很懒。
的JavaScript类型强制使本质上比较
String({}) < String(function(){})
所以基本上你只是在做
"[object Object]" < "function(){}"
这是一个字典字符串比较。
参见[ECMA-262](http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-262.pdf),第11.8.5节 – NullUserException
或[本11.8.5](http: //es5.github.com/#x11.8.5)如果你不想通过PDF进行浏览。 –
Javascript compares objects致电valueOf()
或toString()
。
由于这两个操作数都没有valueOf()
方法,所以它会比较toString()
。
({}).toString()
是[object Object]
。
(function() { }).toString()
是function() { }
。
[
小于f
。
alert(({})) -> [object Object]
alert((function(){})) -> function() {}
[
来f
之前,因此({}) < (function() {})
。
是的,这很愚蠢。 )
非常简单和容易的(内部它们都转换为字符串),这是因为在Javascript
如果对象与数字或字符串进行比较,JavaScript的尝试返回的默认值目的。运算符尝试使用对象的valueOf和toString方法将对象转换为原始值(字符串或数值)。
所以当两个被比较两个对象所使用的内部ToString方法转换成字符串
a.toString()
"[object Object]"
b.toString()
"function() { }"
因此B将被比(较大的字符串) 这就是为什么B> A为真
这是更大的在Chrome中也是如此。 – jer
看起来它可能只是比较对象的地址。如果你可以自信地推测实体'a'和'b'的性质,那么你可能不会发现这种可怕的......但我当然不能:-) –
downvoter care care to comment? – zzzzBov