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

Posted

技术标签:

【中文标题】为啥 false++ 在 Firefox 中会产生 SyntaxError 而在 Chrome 中会产生 ReferenceError?【英文标题】:Why does false++ produce a SyntaxError in Firefox but a ReferenceError in Chrome?为什么 false++ 在 Firefox 中会产生 SyntaxError 而在 Chrome 中会产生 ReferenceError? 【发布时间】:2017-01-22 03:12:03 【问题描述】:

在尝试调试一些错误的 javascript 时,我在源文件中发现了一条看起来像是明显错误的行:

false++;

我不明白为什么这个语句在所有浏览器中的行为都不同。

在 Chrome 中,我得到一个 ReferenceError 并且整个脚本没有运行。 在 Firefox 中,我得到一个 SyntaxError 并且整个脚本没有运行。 在 Internet Explorer 中,我得到一个 SyntaxError 并且脚本只运行到发生错误的行。

是否允许不同的浏览器以不同的方式处理相同的损坏 JavaScript?

我知道错误是什么以及如何修复它,但至少错误类型不应该由规范规定吗?

【问题讨论】:

规范是怎么说的? @Teemu 我不知道。你呢? 应该是引用错误,见ECMA-262 §12.4.1如果LeftHandSideExpression的IsValidSimpleAssignmentTarget为假,则为早期引用错误。后缀运算符尝试修改值,false 是不可变的,因此不是有效的简单赋值目标。 @Teemu:这些信息有什么用处? 【参考方案1】:

Chrome 似乎是最新的。

在ES6 和ES7 中,当尝试assign to a primary expression 时会抛出ReferenceError,这是一个文字(例如false)而不是标识符。 在ES5 中,一个未指定类型的早期错误(通常是SyntaxErrors)被抛出用于赋值“任何可以早期确定该值不是Reference 的值”,尽管if it would happen 和ReferenceError 会被抛出,所以有人可能会争辩说早期错误也应该属于这种类型。 在 ES3 中,错误条件的描述与 ES5 类似,但它只声明“一个实现可以 [原文如此!] 处理以下类型的运行时错误的任何实例作为语法错误和 因此尽早报告”。 在 ES1 和 ES2 中,根本没有错误类型和异常处理,并且分配给非引用的东西被称为“产生运行时错误”。但是,如果实现可以证明在任何情况下都会发生错误,则允许实现在编译时尽早报告它们。

虽然 ES5 或 ES3 措辞可以原谅 Firefox 中的错误处理,但 Internet Explorer 抛出运行时 SyntaxError 的行为与其中任何一个都不匹配。不过,微软计划fix this in Chakra。如需进一步讨论,请参阅https://github.com/tc39/ecma262/issues/257 和https://github.com/tc39/ecma262/issues/691。

【讨论】:

【参考方案2】:

只是猜测,但也许 Firefox 会先检查语法错误,而 Chrome 会先检查参考错误。第一个错误被抛出,& 不再继续。错误的主要原因是 false 是布尔值,而不是整数或数值,因此不能递增或递减。在没有看到源代码的情况下,我会尝试将 false 更改为 var falseCount 之类的内容。

【讨论】:

以上是关于为啥 false++ 在 Firefox 中会产生 SyntaxError 而在 Chrome 中会产生 ReferenceError?的主要内容,如果未能解决你的问题,请参考以下文章

调了一天的CSS的,为啥在firefox中会有白边呢?

为啥@font-face 相对 URL 的加载正确但也会产生 404 错误?

为啥在ie浏览器当文本框为空,可以弹出提示框,在firefox中无法弹出来

为啥 Angular 在 GAME 中会失败?

为啥在 PageViewController 中会出现这种类型的滚动?

为啥在浮点转换中会发生这种情况?