为什么 false++ 在 Firefox 中会产生 SyntaxError 而在 Chrome 中会产生 ReferenceError?

8

在调试一些有问题的JavaScript代码时,我发现源文件中有一个明显错误的行:

false++;

我不明白的是为什么这个语句在所有浏览器中的表现都不同。
  • 在Chrome中,我会得到一个ReferenceError并且整个脚本不会运行。
  • 在Firefox中,我会得到一个SyntaxError并且整个脚本不会运行。
  • 在Internet Explorer中,我会得到一个SyntaxError并且脚本只能运行到错误发生的那一行。
不同浏览器允许以不同的方式处理相同的错误JavaScript,这是设计上的吗?
我知道如何修复这个错误,但是至少错误类型应该由规范指定,对吗?

规范上说了什么? - Teemu
3
@Teemu,我不知道。你呢? - Lynn
3
应该是一个引用错误,请参考ECMA-262 §12.4.1如果LeftHandSideExpression的IsValidSimpleAssignmentTarget为false,则它是早期的引用错误。后缀运算符试图修改值,false是不可变的,因此不是一个有效的简单赋值目标。 - RobG
@Teemu:那些信息有什么用处? - BoltClock
2个回答

5

Chrome似乎是最新的。

  • ES6ES7中,当尝试对字面量(例如false)而非标识符进行赋值时,会抛出ReferenceError异常。
  • ES5中,在"可以提前确定该值不是引用的任何值上"进行赋值时,会抛出未指定类型的早期错误(通常为SyntaxError)。尽管如果出现这种情况会抛出ReferenceError异常,因此有人可能认为早期错误也应该是该类型。
  • 在ES3中,错误条件的描述与ES5类似,但仅说明"实现可能 [sic!] 将以下任何一种运行时错误的所有实例视为语法错误,并因此提早报告它"。
  • 在ES1和ES2中,没有错误类型和异常处理,只能说将非引用对象赋值给某个变量"生成运行时错误"。但是,如果实现可以证明错误情况在任何情况下都会发生,那么允许在编译时提前报告这些错误。

虽然Firefox中的错误处理可以通过ES5或ES3措辞来解释,但Internet Explorer抛出运行时SyntaxError的行为与这些不匹配。然而,微软计划在Chakra中修复此问题。有关进一步讨论,请参见https://github.com/tc39/ecma262/issues/257https://github.com/tc39/ecma262/issues/691


0
只是猜测,也许 Firefox 先检查语法错误,而 Chrome 先检查引用错误。第一个错误被抛出后就不再继续了。错误的主要原因是 false 是一个布尔值,而不是整数或数字值,所以它不能被增加或减少。如果没有看到源代码,我会尝试将 false 更改为类似 var falseCount 的东西。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接