为什么 Node REPL 给出的结果与 Wat video 或我的浏览器控制台不同?

dje*_*lin 4 javascript node.js

例如,在Wat和我的 Chrome 浏览器中:

{} + {}
Run Code Online (Sandbox Code Playgroud)

NaN

但在 Node REPL 中,它是

[object Object][object Object]
Run Code Online (Sandbox Code Playgroud)

诚然,后者对我来说更有意义——强制串起来然后行动是一件相当合理的事情。然而,我不明白这种差异从何而来,因此,不明白我能在多大程度上相信 REPL 能够理解一些简单的 JS 行为。

SLa*_*aks 5

{}既是一个表达式(一个空对象文字)又是一个语句(一个空块)。

eval()将尝试将其输入解析为语句。
如果它不是“正常”语句(例如,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 + ')',
Run Code Online (Sandbox Code Playgroud)