вернуться к уроку

Почему [] == [] неверно, а [ ] == ![ ] верно?

важность: 5

Почему первое равенство – неверно, а второе – верно?

alert( [] == [] ); // false
alert( [] == ![] ); // true

Какие преобразования происходят при вычислении?

Ответ по первому равенству

Два объекта равны только тогда, когда это один и тот же объект.

В первом равенстве создаются два массива, это разные объекты, так что они неравны.

Ответ по второму равенству

  1. Первым делом, обе части сравнения вычисляются. Справа находится ![]. Логическое НЕ '!' преобразует аргумент к логическому типу. Массив является объектом, так что это true. Значит, правая часть становится ![] = !true = false. Так что получили:

    alert( [] == false );
  2. Проверка равенства между объектом и примитивом вызывает численное преобразование объекта.

    У массива нет valueOf, сработает toString и преобразует массив в список элементов, то есть – в пустую строку:

    alert( '' == false );
  3. Сравнение различных типов вызывает численное преобразование слева и справа:

    alert( 0 == 0 );

    Теперь результат очевиден.