Почему {}!= ({}) В JavaScript?

Общеизвестно, что {} является более коротким способом определения объекта типа [] для массива.

Но теперь мне интересно, почему:

{} != ({})
  • {} оценивается как undefined
  • ({}) оценивает "правильный" объект

Почему JavaScript ведет себя так?

Например, 1 равно (1), поэтому почему {} не равно ({})?

Ответы

Ответ 1

{} != ({})

Это синтаксическая ошибка.

SyntaxError: Неожиданный токен!=

{} так неоднозначно. Это пустой блок или пустой литерал объекта? Это не так, потому что оператор сравнения не может следовать за блоком.

Объединяя его с круглой скобкой, парсер рассматривает его как выражение. Выражение не может содержать блок, поэтому он знает его как объект.

Однако, если вы свернете это сравнение в выражении...

({} != ({}))

... это все еще верно, потому что переменные, у которых есть назначенный им объект, являются указателем на них, и, как следствие, они никогда не копируются их содержимым (хотя это не относится к вашему примеру). Из-за этого их указатель всегда отличается и сравнение не выполняется.

Это также означает, что сравнение двух переменных, указывающих на один и тот же объект, будет работать так, как ожидалось, поскольку их указатели будут одинаковыми.

Ответ 2

{} != {} истинно, потому что оба {} - совершенно разные объекты. Однако переменные, ссылающиеся на один и тот же объект, имеют равенство:

​var a = {},
    b = a;

assert( a == b )​