Почему [] == [] неверно, а [ ] == ![ ] верно?
Почему первое равенство – неверно, а второе – верно?
alert( [] == [] ); // false
alert( [] == ![] ); // true
Какие преобразования происходят при вычислении?
Ответ по первому равенству
Два объекта равны только тогда, когда это один и тот же объект.
В первом равенстве создаются два массива, это разные объекты, так что они неравны.
Ответ по второму равенству
-
Первым делом, обе части сравнения вычисляются. Справа находится
![]
. Логическое НЕ'!'
преобразует аргумент к логическому типу. Массив является объектом, так что этоtrue
. Значит, правая часть становится![] = !true = false
. Так что получили:alert( [] == false );
-
Проверка равенства между объектом и примитивом вызывает численное преобразование объекта.
У массива нет
valueOf
, сработаетtoString
и преобразует массив в список элементов, то есть – в пустую строку:alert( '' == false );
-
Сравнение различных типов вызывает численное преобразование слева и справа:
alert( 0 == 0 );
Теперь результат очевиден.