Javascript 为什么{}<;函数(){}?
当我在JavaScript中处理真值表时,我注意到以下结果为真:Javascript 为什么{}<;函数(){}?,javascript,operators,logical-operators,Javascript,Operators,Logical Operators,当我在JavaScript中处理真值表时,我注意到以下结果为真: var a, b, c; a = {}; b = function(){}; c = a < b; console.log(c); var a、b、c; a={}; b=函数(){}; c=a
var a, b, c;
a = {};
b = function(){};
c = a < b;
console.log(c);
var a、b、c;
a={};
b=函数(){};
c=a
为什么?
我只在Firefox中测试过这个,我相信我可以在ECMAScript 2.6.2规范中找到细节,但是我觉得很懒。JavaScript类型强制从本质上进行了比较
String({}) < String(function(){})
String({})
所以本质上你只是在做
"[object Object]" < "function (){}"
“[对象]”<“函数(){}”
这是一个字典字符串比较。通过调用valueOf()
或toString()
由于两个操作数都没有
valueOf()
方法,因此它将比较toString()
s
({}).toString()
是[对象]
(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将大于a(更大的字符串)
这就是为什么b>a是真的在Chrome中也是真的。看起来它可能只是在比较对象的地址。如果你能自信地推理实体
a
和b
,那么你可能不会觉得这很可怕……尽管我当然不能:-)看,第11.8.5节,或者如果你不想涉入PDF