Chrome 中的 SyntaxError 但节点中的 ReferenceError

SyntaxError in Chrome but ReferenceError in node

所以我 运行 在 chrome 和节点上使用相同的代码 5=6 这当然会产生错误。但是看看错误类型!

在 chrome 上它是节点 ReferenceError 上的 SyntaxError

嗯,这很奇怪。一方面是因为两者都使用 v8,另一方面是因为......你会认为这会在规范中定义,所以一定有人错了。

同样的事情也发生在字符串上。当 运行 在 chrome 控制台外将 js 作为脚本运行时也是如此。 运行在节点控制台之外作为脚本运行时也是如此。

有人认为这可能是由于拳击的差异,因为 Number(5) = 6 在两者上都是 ReferenceError,但任何 fn() = _ 都是如此。如果是这样,那么它仍然 不能解释为什么两个引擎的行为不同。

那么(根据规范)在这里正确的做法是什么?谁错了,为什么两个引擎给我不同的错误?

来自搜索

分配给文字是语法错误类型。

A ReferenceError 当某处出现意外分配时发生

A SyntaxError 当对象在尝试解释语法无效代码时表示错误

try {
  Number(5) = 6
} catch (e) {
  console.log(e instanceof ReferenceError)  // true
  console.log(e.message)                    // ""
  console.log(e.name)                       // "ReferenceError"
  console.log(e.fileName)                   
  console.log(e.lineNumber)                 
  console.log(e.columnNumber)               
  console.log(e.stack)                      
}

但是typeof Number(5)是数字但是赋值给函数在js中是有效的。

当我在下面写的时候给出 SyntaxError 而不是 ReferenceError

try {
  5 = 6
} catch (e) {
  console.log(e instanceof ReferenceError)  
  console.log(e.message)                    
  console.log(e.name)                       
  console.log(e.fileName)                   
  console.log(e.lineNumber)                 
  console.log(e.columnNumber)               
  console.log(e.stack)                      
}

它们的错误细节是相同的,但Number(5)在js语法上有效的代码,但它在两种情况下的错误是相同的(赋值中的左侧无效)。唯一的区别是 Number(5) 在 js 中是语法上有效的代码,但在 node 中不是。

但是在node 12.14.0中我使用的error和js一样,然后node改变了它的错误类型。 这意味着 js 对于这种错误类型是正确的

ECMAScript 语言规范 changed in June 2019 因此许多以前 ReferenceError 的东西(包括尝试分配给数字文字)现在是 SyntaxError

v8 implemented this change(也在 2019 年 6 月)在版本 7.7.196 中,包含在 Chrome77 和 Node 12.11 中。在这些版本之前,尝试分配给数字文字会导致在 Node 和 Chrome 中都出现 ReferenceError。从这些版本开始,相同的代码现在会生成 SyntaxError.

$ ./node-v12.10.0 -e 5=6 2>&1 | grep Error
ReferenceError: Invalid left-hand side in assignment
$ ./node-v12.11.0 -e 5=6 2>&1 | grep Error
SyntaxError: Invalid left-hand side in assignment