Приведение массива к Bool
Здравствуйте. Знаю что вопрос может быть обсуждался, но всё же, плиз, объясните. Перечитал, перегуглил, есть объяснения, но я не понимаю их.
Вот собственно вопрос: console.log(![] == true);//false console.log([] == true);//false console.log(![]);//false ??? СПАСИБО |
Тут все дело в преобразованиях типа и приоритете операций.
Начнем с 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 |
voraa всё хорошо расписал, добавлю только, что в современном js никто уже не использует ==, только ===.
|
Часовой пояс GMT +3, время: 04:50. |