例如,在Wat和我的 Chrome 浏览器中:
{} + {}
是NaN
但在 Node REPL 中,它是
[object Object][object Object]
诚然,后者对我来说更有意义 - 强制执行字符串然后采取行动是一件非常合理的事情。但是我不明白这种差异来自哪里,因此,我不明白我能在多大程度上信任 REPL 来理解一些简单的 JS 行为。
例如,在Wat和我的 Chrome 浏览器中:
{} + {}
是NaN
但在 Node REPL 中,它是
[object Object][object Object]
诚然,后者对我来说更有意义 - 强制执行字符串然后采取行动是一件非常合理的事情。但是我不明白这种差异来自哪里,因此,我不明白我能在多大程度上信任 REPL 来理解一些简单的 JS 行为。
{}
既是一个表达式(一个空对象字面量)又是一个语句(一个空块)。
eval()
将尝试将其输入解析为语句。
如果它不是“正常”语句(例如 an if
),它将被解析为表达式语句,该语句对表达式求值。
因此,{} + {}
被解析为两个语句(通过 ASI):{}; +{}
. 第一条语句是一个空块;第二条语句是将对象强制为数字的一元运算 +
符。
将一个对象强制为一个数字涉及调用toString()
(它返回"[object Object]"
),然后将结果解析为一个数字(它不是)。
eval()
然后将其作为最终语句的值返回。
Node将其 REPL 输入包装起来,()
以强制将其解析为表达式:
// First we attempt to eval as expression with parens.
// This catches '{a : 1}' properly.
self.eval('(' + evalCmd + ')',