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
所以我 运行 在 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改变了它的错误类型。
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