Почему {} <function () {}? - PullRequest
       42

Почему {} <function () {}?

6 голосов
/ 14 ноября 2011

Пока я возился с таблицами истинности в JavaScript, я заметил, что следующее значение имеет значение true:

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

Почему?

Я проверял это только вFirefox, и я уверен, что смогу выкопать детали в спецификации ECMAScript 2.6.2, но TBH мне лень.

Ответы [ 4 ]

17 голосов
/ 14 ноября 2011

Приведение типов JavaScript делает сравнение по существу

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

по сути, вы просто делаете

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

, что является сравнением лексикографической строки.

8 голосов
/ 14 ноября 2011

Javascript сравнивает объекты , вызывая valueOf() или toString().
Поскольку ни у одного из операндов нет метода valueOf(), он будет сравнивать toString() с.

({}).toString() равно [object Object].
(function() { }).toString() равно function() { }.

[ меньше f.

4 голосов
/ 14 ноября 2011
alert(({}))            -> [object Object]
alert((function(){}))  -> function () {}

[ предшествует f, следовательно ({}) < (function () {}).

Да, это глупо. ;)

0 голосов
/ 14 ноября 2011

довольно просто и легко ( внутренне они оба преобразуются в строки ), потому что в Javascript

Если объект сравнивается с числом или строкой, JavaScript пытается вернуть значение по умолчаниюзначение для объекта.Операторы пытаются преобразовать объект в примитивное значение, значение String или Number, используя методы объектов valueOf и toString.

, поэтому при сравнении обоих объектов оба объекта преобразуются в строку с использованием внутреннего метода Tostring

    a.toString()
"[object Object]"

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

, следовательно, b будет больше, чем (более крупная строка), поэтому b> a является истинным

...