Показать сообщение отдельно
  #2 (permalink)  
Старый 29.03.2021, 17:01
Аватар для voraa
Профессор
Отправить личное сообщение для voraa Посмотреть профиль Найти все сообщения от voraa
 
Регистрация: 03.02.2020
Сообщений: 2,744

Тут все дело в преобразованиях типа и приоритете операций.
Начнем с 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, 29.03.2021 в 17:11.
Ответить с цитированием