Я считаю, что разница заключается в том, как Chrome Консоль интерпретирует ваш код:
Это выражение:
{} + {}
//=> "[object Object][object Object]"
А это «программа»:
{} + {};
Обратите внимание, что NaN
может быть достигнуто с помощью всего {} + {}
, если это была ваша «полная программа»:
![enter image description here](https://i.stack.imgur.com/9kNfu.png)
Вот что доктор Аксель Раушмайер говорит в «Что такое {} + {} в JavaScript?»
Проблема в том, что JavaScript интерпретирует первое {} как пустой блок кода и игнорирует его. Таким образом, NaN вычисляется путем вычисления + {} (плюс, за которым следует второе {}).
Итак, в {} + {};
NaN
получается из вычисления +{}
. (Первый {}
игнорируется.)
Первый {}
как блок кода более очевиден в этом примере: (попробуйте это в своей командной строке)
{ while (false) x++ } + {}
//=> NaN
Если JS должен был видеть { while (false) x++ }
как объект, это вызвало бы синтаксическую ошибку. Но это не так, в данном случае это должен быть блок кода; он игнорирует его и оценивает +{}
, давая NaN
.
Итак, чтобы «заставить» JS видеть {}
как объекты, а не блоки кода, вы можете заключить их в (). Попробуйте это в консоли Chrome:
({}) + ({});
//=> "[object Object][object Object]"
({} + {});
//=> "[object Object][object Object]"