Почему консоль chrome дает разные результаты между {} + {} и {} + {}; - PullRequest
1 голос
/ 25 мая 2020

Если я наберу Chrome console

{} + {}, я получаю "[object Object][object Object]"

, но если я добавлю точку с запятой, результат будет другим:

{} + {}; Я получаю NaN

Но я не понимаю разницы. Первое имеет смысл, поскольку для меня правила оператора сложения следующие:

  1. Если хотя бы один операнд является объектом, он преобразуется в примитивное значение (строка, число или логическое значение);
  2. После преобразования, если хотя бы один операнд является строковым, второй операнд преобразуется в строку и выполняется конкатенация;
  3. В противном случае оба операнда преобразуются в числа, и выполняется сложение арифметики c.

Поскольку оба операнда являются объектами, они преобразуются в строку. Но что происходит во втором случае?

Если я назначу значение (a = ...) в обоих случаях, моя переменная будет строкой. Я попытался найти спецификацию того, что Chrome возвращает консоль при задании выражения, но не нашел 1. Как ни странно, добавление комментария также вернет NaN: {} + {} //comment => NaN

Я знаю, что Javascript иногда может быть странным, но почти всегда есть логическое объяснение. в зависимости от того, как Chrome интерпретирует это. Firefox, с другой стороны, возвращает NaN для обоих случаев, что я тоже не понимаю.

1 Ответ

3 голосов
/ 25 мая 2020

Я считаю, что разница заключается в том, как Chrome Консоль интерпретирует ваш код:

Это выражение:

{} + {}
//=> "[object Object][object Object]"

А это «программа»:

{} + {};

Обратите внимание, что NaN может быть достигнуто с помощью всего {} + {}, если это была ваша «полная программа»:

enter image description here

Вот что доктор Аксель Раушмайер говорит в «Что такое {} + {} в JavaScript?»

Проблема в том, что JavaScript интерпретирует первое {} как пустой блок кода и игнорирует его. Таким образом, NaN вычисляется путем вычисления + {} (плюс, за которым следует второе {}).

Итак, в {} + {}; NaN получается из вычисления +{}. (Первый {} игнорируется.)

Первый {} как блок кода более очевиден в этом примере: (попробуйте это в своей командной строке)

{ while (false) x++ } + {}
//=> NaN

Если JS должен был видеть { while (false) x++ } как объект, это вызвало бы синтаксическую ошибку. Но это не так, в данном случае это должен быть блок кода; он игнорирует его и оценивает +{}, давая NaN.

Итак, чтобы «заставить» JS видеть {} как объекты, а не блоки кода, вы можете заключить их в (). Попробуйте это в консоли Chrome:

({}) + ({});
//=> "[object Object][object Object]"

({} + {});
//=> "[object Object][object Object]"
...