Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Приведение массива к Bool (https://javascript.ru/forum/misc/82190-privedenie-massiva-k-bool.html)

vitek-82 29.03.2021 16:25

Приведение массива к Bool
 
Здравствуйте. Знаю что вопрос может быть обсуждался, но всё же, плиз, объясните. Перечитал, перегуглил, есть объяснения, но я не понимаю их.

Вот собственно вопрос:

console.log(![] == true);//false
console.log([] == true);//false
console.log(![]);//false


??? СПАСИБО

voraa 29.03.2021 17:01

Тут все дело в преобразованиях типа и приоритете операций.
Начнем с 3.
Есть операция !. Она требует, что бы ее операнд был типа воolean. Поэтому операнд преобразуется к этому типу. Любой объект (а массив, даже пустой - это объект) преобразуется к true. !true дает false.

1 - должно быть понятно. выполняется (![]) == true. Т.е false == true дает false.

Теперь 2. У операции == свои правила преобразования типов
Если типы операндов разные и не числа и не строки, то к ним применяется операция toPrimitive(). Для массивов в этом случае используется операция toString . [1,2,3].toString() - дает "1,2,3". А
[].toString() - дает "" - пустую строку.
true.toPrimitive() - преобразуется в число 1
Т.е мы сравниваем "" == 1
В этом случае, когда сравниваются строка и число, делается попытка преобразовать строку в число "" - преобразуется в 0
В итоге имеем 0 == 1 - false.

По этой же причине
console.log([1] == 1) // true
console.log([2] == 2) // true

Aetae 29.03.2021 21:33

voraa всё хорошо расписал, добавлю только, что в современном js никто уже не использует ==, только ===.


Часовой пояс GMT +3, время: 04:50.