#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 истинно