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

{} + {}

NaN
但是在 Node REPL 中,它是
[object Object][object Object]

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

最佳答案

{} 既是表达式(空对象字面量)又是语句(空块)。
eval() 将尝试将其输入解析为语句。
如果它不是“正常”语句(例如 if ),它将被解析为表达式语句,该语句对表达式进行计算。

因此,{} + {} 被解析为两个语句(通过 ASI): {}; +{} 。第一个语句是一个空块;第二个语句是一元 + 运算符,它将对象强制转换为数字。
将对象强制为数字涉及调用 toString() (返回 "[object Object]" ),然后将结果解析为数字(它不是)。eval() 然后将其作为最终语句的值返回。
() 中的 Node wraps its REPL input 强制将其解析为表达式:

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

关于javascript - 为什么 Node REPL 不能提供与 Wat 视频或我的浏览器控制台相同的结果?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17455653/

10-13 03:09