Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/369.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为什么{}<;函数(){}?_Javascript_Operators_Logical Operators - Fatal编程技术网

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

当我在JavaScript中处理真值表时,我注意到以下结果为真:

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