Оператор сравнения == и конструкция if [дубликат]

177
25 ноября 2021, 15:40
На этот вопрос уже даны ответы здесь:
Преобразование скалярных типов при сравнении JavaScript (2 ответа)
В чем разница между valueOf и toString (2 ответа)
Закрыт 2 года назад.

Столкнулся с таким нюансом, что 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/ Она хоть и хороша, но похоже, составлена методом тыка и не даёт, ответа, что, почему и откуда берутся именно эти значения.

Answer 1

Логический оператор && возвращает правое значение, если левое истина, то есть оператор if некорректно сравнивать с (), которое возвращает полученный результат, в данном случае ({} && []) вернет пустой массив объект и сравнивать его с истиной тоже некорректно. Оператор if преобразует выражение к логическому типу и если выражение равно 0, пустой строке "", null, undefined и NaN, то результат становится false, иначе истина.

READ ALSO
HTML,CSS,JavaScript

HTML,CSS,JavaScript

Как сделать загрузку теста сделанный в блокноте и чтобы принимался и вставал по своим местам?

106
Получить значение input, а именно числовое значение, записанное в него с помощью класса

Получить значение input, а именно числовое значение, записанное в него с помощью класса

Как получить числовое значение, записанное в input, с помощью его класса? Или значение можно получить только используя id?

178
Перетаскивание OpenStreetMaps сквозь блок

Перетаскивание OpenStreetMaps сквозь блок

У меня поверх карты OpenStreetMaps находится divИ когда карта перемещается мышкой, то она так же перемещается сквозь блок

165
Как оптимизировать google карту?

Как оптимизировать google карту?

У меня карта внизу страницы, но сильно ее тормозит на speed page это видно, как сделать так, чтобы при загрузке страницы карта не грузилась, а начинала...

112