当我在JavaScript中使用真值表时,我注意到以下评估为真:
var a, b, c;
a = {};
b = function(){};
c = a < b;
console.log(c);
为什么?
我只在Firefox中测试了这个,我确信我可以在ECMAScript 2.6.2规范中挖掘细节,但TBH我感觉很懒。
答案 0 :(得分:17)
JavaScript类型强制使得比较基本上是
String({}) < String(function(){})
所以基本上你只是在做
"[object Object]" < "function (){}"
这是一个词典字符串比较。
答案 1 :(得分:8)
Javascript compares objects致电valueOf()
或toString()
由于两个操作数都没有valueOf()
方法,因此它会比较toString()
s。
({}).toString()
是[object Object]
(function() { }).toString()
为function() { }
。
[
小于f
。
答案 2 :(得分:4)
alert(({})) -> [object Object]
alert((function(){})) -> function () {}
[
出现在f
之前,因此({}) < (function () {})
。
是的,这太傻了。 ;)
答案 3 :(得分:0)
非常简单易用(内部都转换为字符串)这是因为在Javascript中
如果将对象与数字或字符串进行比较,JavaScript会尝试返回该对象的默认值。运算符尝试使用对象的valueOf和toString方法将对象转换为原始值,String或Number值。
因此,当比较两者时,使用内部Tostring方法将两个对象转换为字符串
a.toString()
"[object Object]"
b.toString()
"function () { }"
因此b将大于a(更大的字符串) 这就是为什么b&gt;一个是真的