Ответ 1
{} != ({})
Это синтаксическая ошибка.
SyntaxError: Неожиданный токен!=
{}
так неоднозначно. Это пустой блок или пустой литерал объекта? Это не так, потому что оператор сравнения не может следовать за блоком.
Объединяя его с круглой скобкой, парсер рассматривает его как выражение. Выражение не может содержать блок, поэтому он знает его как объект.
Однако, если вы свернете это сравнение в выражении...
({} != ({}))
... это все еще верно, потому что переменные, у которых есть назначенный им объект, являются указателем на них, и, как следствие, они никогда не копируются их содержимым (хотя это не относится к вашему примеру). Из-за этого их указатель всегда отличается и сравнение не выполняется.
Это также означает, что сравнение двух переменных, указывающих на один и тот же объект, будет работать так, как ожидалось, поскольку их указатели будут одинаковыми.