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