Столкнулся с таким нюансом, что 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/ Она хоть и хороша, но похоже, составлена методом тыка и не даёт, ответа, что, почему и откуда берутся именно эти значения.
Логический оператор && возвращает правое значение, если левое истина, то есть оператор if некорректно сравнивать с (), которое возвращает полученный результат, в данном случае ({} && []) вернет пустой массив объект и сравнивать его с истиной тоже некорректно. Оператор if преобразует выражение к логическому типу и если выражение равно 0, пустой строке "", null, undefined и NaN, то результат становится false, иначе истина.
Сборка персонального компьютера от Artline: умный выбор для современных пользователей