Почему {} < функция(){}?

#javascript #operators #logical-operators

#javascript #операторы #логические операторы

Вопрос:

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

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

Почему?

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

Комментарии:

1. Это верно и в Chrome.

2. Похоже, это может быть просто сравнение адресов объектов. Если вы можете уверенно рассуждать о природе сущностей a и b , то, вероятно, вас это не напугает… хотя я, конечно, не могу 🙂

Ответ №1:

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

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

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

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

это сравнение лексикографических строк.

Комментарии:

1. Смотрите ECMA-262 , раздел 11.8.5

2. Или этот 11.8.5 , если вы не хотите копаться в PDF.

Ответ №2:

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

({}).toString() является [object Object] .
(function() { }).toString() является function() { } .

[ меньше f .

Ответ №3:

 alert(({}))            -> [object Object]
alert((function(){}))  -> function () {}
  

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

Да, это глупо. 😉

Ответ №4:

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

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

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

     a.toString()
"[object Object]"

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

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