Столкнулся с таким нюансом, что if и конструкция var== false/true выдают разные результаты. Пожалуй, код продемонстрирует лучше слов:
if ({} && []) {
console.log(({} && []) == true); // сработает и выведет false
}
То есть выражение {} && [] в конструкции if ведёт себя как true. Но при явном применении оператора сравнения говорит, что это не так. И я нигде не могу найти объяснения, которое бы меня удовлетворило. Другой показательный пример:
var c = new Boolean(false);
if(c) {// == true - не сработает
console.log("8))))");
console.log(c==false);
}
На всех ресурсах, что я нашел, только вскользь в пяти словах упоминается о разном поведении, но никакого экскурса в причины.
Единственная нить с одного из них, за которую я зацепился - это valueof. Якобы при == происходит численное сравнение, а не логическое, а за преобразование самого объекта в число отвечает именно valueOf. Но в описании самого valueOf я не нашел никакой четкой информации, кроме как той, что если он не переопределен, то наследуется от Object - но какая его реализация у Object? Какие правила? Почему, например, [2] == false, как [], а [1] == true?
Наткнулся так же на такую таблицу https://dorey.github.io/JavaScript-Equality-Table/ Она хоть и хороша, но похоже, составлена методом тыка и не даёт, ответа, что, почему и откуда берутся именно эти значения.
new Boolean(false)тоже считается истинным, в то время какfalseэто примитив, который истинным уже не считается – andreymal Nov 25 '19 at 23:44true? – Александр Nov 25 '19 at 23:55==всё сложно, вот тут есть таблица приведений типов. Если я правильно понимаю, массив приводится сперва к строке, а потом к числу, поэтому[]==false(пустой массив→пустая строка→0==false) и[0]==falseпо той же логике (массив→"0"→0), но при этом[1]==true(true приводится к числу 1, false к числу 0) – andreymal Nov 25 '19 at 23:56[]или даже[2]приводится кfalse, (а[1]почему-тоtrue) – Александр Nov 26 '19 at 01:18if– Grundy Nov 26 '19 at 08:25