【问题标题】:Why does Node REPL not give the same results as Wat video or my browser console?为什么 Node REPL 没有给出与 Wat 视频或我的浏览器控制台相同的结果?
【发布时间】:2013-07-03 18:32:45
【问题描述】:

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

{} + {}

NaN

但在 Node REPL 中,它是

[object Object][object Object]

无可否认,后者对我来说更有意义 - 强制执行字符串然后采取行动是一件非常合理的事情。但是我不明白这种差异从何而来,因此,我不明白我可以在多大程度上信任 REPL 来理解一些简单的 JS 行为。

【问题讨论】:

标签: javascript node.js


【解决方案1】:

{} 既是表达式(空对象字面量)又是语句(空块)。

eval() 将尝试将其输入解析为语句。
如果它不是一个“正常”语句(例如,if),它将被解析为一个表达式语句,它计算一个表达式。

因此,{} + {} 被解析为两个语句(通过 ASI):{}; +{}。第一条语句是一个空块;第二个语句是 unary + 运算符,它将对象强制为数字。
将一个对象强制为一个数字涉及调用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 + ')',

【讨论】:

  • 有了这个,我想我实际上了解了 wat vidoe 中的所有 JS。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-10
  • 2020-09-12
相关资源
最近更新 更多