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