Ответ 1
Первый:
[] == false
Оператор ==
выполняет преобразование типа в свои операнды, в этом случае обе стороны преобразуются в число, шаги, выполненные в алгоритме сравнения абстрактного равенства, будут быть:
- object == boolean
- объект == номер
- string == number
- number == number
В коде:
[] == false; // convert false to Number
[] == 0; // convert [] to Primitive (toString/valueOf)
"" == 0; // convert "" to Number
0 == 0; // end
Второе сравнение []
преобразуется в примитив, выполняются их методы valueOf
и toString
, но поскольку valueOf
в объектах Array возвращает сам объект (наследуется от Object.prototype
), тогда используется метод toString
.
В конце, как вы видите, оба операнда преобразуются в число, и оба равны нулю, например:
Number([]) == 0;
Number(false) == 0;
И пустой массив генерирует нуль при преобразовании в число, поскольку его строковое представление представляет собой пустую строку:
[].toString(); // ""
И пустая строка, преобразованная в Number, возвращает ноль:
+""; // 0
Теперь двойное отрицание (!![]
) производит true, потому что все экземпляры объекта являются правдивыми:
![]; // false, [] is truthy
!![]; // true, negation
Единственными значениями, которые являются ложными, являются:
-
null
-
undefined
-
0
-
NaN
-
""
(пустая строка) -
false
Все, что угодно, создаст true
при преобразовании в Boolean.
См. также: