Пока [] + []
пустая строка, [] + {}
есть "[object Object]"
и {} + []
есть 0
. Почему {} + {}
NaN?
> {} + {}
NaN
Мой вопрос не почему ({} + {}).toString()
это в "[object Object][object Object]"
то время как NaN.toString()
есть "NaN"
, эта часть ответа уже здесь .
Мой вопрос: почему это происходит только на стороне клиента? На стороне сервера ( Node.js ) {} + {}
есть "[object Object][object Object]"
.
> {} + {}
'[object Object][object Object]'
Подводя итог :
На стороне клиента:
[] + [] // Returns ""
[] + {} // Returns "[object Object]"
{} + [] // Returns 0
{} + {} // Returns NaN
NaN.toString() // Returns "NaN"
({} + {}).toString() // Returns "[object Object][object Object]"
var a = {} + {}; // 'a' will be "[object Object][object Object]"
В Node.js:
[] + [] // Returns "" (like on the client)
[] + {} // Returns "[object Object]" (like on the client)
{} + [] // Returns "[object Object]" (not like on the client)
{} + {} // Returns "[object Object][object Object]" (not like on the client)
javascript
node.js
eval
google-chrome-devtools
web-developer-toolbar
Ионика Бизэу
источник
источник
{}
это можно интерпретировать как выражение или как примитив объекта в зависимости от контекста. Может быть, код одинаков на клиенте и на сервере, но интерпретируется по-{}
разному из-за разного контекста ввода кода.Ответы:
Обновлено примечание: это было исправлено в Chrome 49 .
Очень интересный вопрос! Давайте копаться в.
Коренная причина
Корень разницы в том, как Node.js оценивает эти утверждения по сравнению с инструментами разработки Chrome.
Что делает Node.js
Node.js использует для этого модуль repl .
Из исходного кода REPL Node.js :
Это работает так же, как
({}+{})
в инструментах разработчика Chrome, которые также производят,"[object Object][object Object]"
как вы ожидаете.Что делают инструменты разработчика Chrome
С другой стороны, инструменты разработчика Chrome делают следующее :
Так что, в основном, он выполняет
call
объект с выражением. Выражение:Итак, как вы можете видеть, выражение вычисляется напрямую, без скобок для переноса.
Почему Node.js действует по-другому
Источник Node.js оправдывает это:
Узел не всегда так себя ведет. Вот фактический коммит, который изменил его . Райан оставил следующий комментарий к изменению: «Улучшить способ обхода команд REPL» с примером различия.
носорог
Обновление - OP интересовался тем, как ведет себя Rhino (и почему он ведет себя как devtools в Chrome и в отличие от nodejs).
Rhino использует совершенно другой движок JS, в отличие от инструментов разработчика Chrome и REPL Node.js, которые используют V8.
Вот основная линия того, что происходит, когда вы выполняете команду JavaScript с Rhino в оболочке Rhino.
Оболочка работает
org.mozilla.javascript.tools.shell.main
.В свою очередь, это вызывает это
new IProxy(IProxy.EVAL_INLINE_SCRIPT);
, например, если код был передан непосредственно с встроенного переключателя -e.Это поражает
run
метод IProxy .Это вызывает
evalInlineScript
( SRC ). Это просто компилирует строку и уничтожает ее.В принципе:
Из всех трех оболочка Rhino - это та, которая ближе всего подходит к реальному
eval
без какой-либо обертки. Rhino's наиболее близок к реальномуeval()
утверждению, и вы можете ожидать, что оно будет вести себя точно так же, как иeval
раньше.источник
eval
)evaluateOn
. В ноде все очень хорошо документировано - у них есть специальный модуль REPL со всей историей, приятной и удобной на git, раньше я использовал REPL в своих собственных программах, я знал, где искать :) Я рад, что вам понравилось и нашел это полезно, но я обязан своим знакомством с этими основами кода (dev-tools и nodejs), а не своим интеллектом. Переход к источнику часто всегда самый простой.