2013-07-03 2 views
3

Например, в обоих Wat и в моем браузере Chrome:Почему Node REPL не дает те же результаты, что и видео Wat или консоль моего браузера?

{} + {} 

является NaN

Но в узле РЕПЛ, это

[object Object][object Object] 

Последние правда имеет смысл для меня - принуждающее к строке, а затем действовать - это довольно разумная вещь. Однако я не понимаю, откуда происходит это несоответствие, и поэтому не понимаю, насколько я могу доверять REPL, чтобы понять какое-то простое поведение JS.

+0

возможный дубликат [Почему {} + {} является НЭН только на стороне клиента? Почему не в Node.js?] (Http://stackoverflow.com/questions/17268468/why-is-nan-only-on-the-client-side-why-not-in-node-js) – SLaks

ответ

4

{} - это выражение (пустой литерал объекта) и оператор (пустой блок).

eval() попытается проанализировать его ввод как инструкцию.
Если это не «нормальный» оператор (например, if), он будет анализироваться как оператор выражения, который оценивает выражение.

Поэтому {} + {} разобран как два оператора (через ASI): {}; +{}. Первый оператор - пустой блок; вторым оператором является оператор унарный+, который принуждает объект к числу.
Принуждение объекта к числу включает вызов toString() (который возвращает "[object Object]"), а затем разбор результата в виде числа (а это не так).
eval() затем возвращает это значение окончательного утверждения.

Узел wraps its REPL input в (), чтобы заставить его быть проанализирован как выражение:

// First we attempt to eval as expression with parens. 
    // This catches '{a : 1}' properly. 
    self.eval('(' + evalCmd + ')', 
+0

и с что, я думаю, я действительно понимаю все JS в ват-видое. Благодарю. – djechlin

Смежные вопросы