页面模式偏好

附录 F (资料性) 引入与以前版本不兼容性的新增内容和更改

6.2.5:在 ECMAScript 2015 中,不允许 Function 调用返回 Reference Record。

7.1.4.1:在 ECMAScript 2015 中,对 String 值应用 ToNumber 现在会识别并转换 BinaryIntegerLiteral 和 OctalIntegerLiteral 数值字符串。在以前的版本中,此类字符串会被转换为 NaN。

9.3:在 ECMAScript 2018 中,Template 对象基于 Parse Node(源位置)进行规范化,而以前的版本是在 Realm 中该模板字面量或带标签模板的所有出现位置之间进行规范化。

12.2:ECMAScript 2016 强制要求 Unicode 8.0.0 或更高版本,而 ECMAScript 2015 强制要求 Unicode 5.1。尤其是,这导致 U+180E MONGOLIAN VOWEL SEPARATOR 从 Space_Separator(Zs)类别(因此在 ECMAScript 2015 中被视为空白)移动到 Format(Cf)类别(自 Unicode 6.3.0 起)。这会导致对空白敏感的方法产生不同的行为。例如,"\u180E".trim().length 在以前版本中为 0,但在 ECMAScript 2016 及更高版本中为 1。此外,ECMAScript 2017 强制规定始终使用 Unicode 标准的最新版本。

12.7:在 ECMAScript 2015 中,IdentifierName 的有效码点使用 Unicode 属性“ID_Start”和“ID_Continue”来规定。在以前的版本中,有效的 IdentifierName 或 Identifier 码点通过枚举各种 Unicode 码点类别来规定。

12.10.1:在 ECMAScript 2015 中,如果 do-while 语句末尾缺少分号,自动分号插入会在其末尾添加分号。此更改使规范与大多数现有实现的实际行为一致。

13.2.5.1:在 ECMAScript 2015 中,Object Initializer 中存在重复属性名称不再是提前错误。

13.15.1:在 ECMAScript 2015 中,严格模式代码如果包含对不可变绑定(例如 FunctionExpression 的函数名称)的赋值,不会产生提前错误,而是产生运行时错误。

14.2:在 ECMAScript 2015 中,以 token let 开头,后跟输入元素 LineTerminator,再后跟 Identifier 的 StatementList 是 LexicalDeclaration 的开始。在以前的版本中,自动分号插入始终会在 Identifier 输入元素之前插入分号。

14.5:在 ECMAScript 2015 中,以 token let 开头且后跟 token [ 的 StatementListItem 是 LexicalDeclaration 的开始。在以前的版本中,这种序列会是 ExpressionStatement 的开始。

14.6.2:在 ECMAScript 2015 中,IfStatement 的正常结果永远不会是值 empty。如果没有对 Statement 部分求值,或者求值的 Statement 部分产生包含 empty 的正常完成,则 IfStatement 的结果是 undefined。

14.7:在 ECMAScript 2015 中,如果 for 语句的 ( token 后面紧接 token 序列 let [,则该 let 被视为 LexicalDeclaration 的开始。在以前的版本中,这种 token 序列会是 Expression 的开始。

14.7:在 ECMAScript 2015 中,如果 for-in 语句的 ( token 后面紧接 token 序列 let [,则该 let 被视为 ForDeclaration 的开始。在以前的版本中,这种 token 序列会是 LeftHandSideExpression 的开始。

14.7:在 ECMAScript 2015 之前,初始化表达式可以作为位于 in 关键字之前的 VariableDeclaration 的一部分出现。在 ECMAScript 2015 中,相同位置的 ForBinding 不允许出现此类初始化器。在 ECMAScript 2017 中,此类初始化器只允许出现在非严格代码中。

14.7:在 ECMAScript 2015 中,对 IterationStatement 求值的结果永远不会是 [[Value]] 为 empty 的正常完成。如果没有对 IterationStatement 的 Statement 部分求值,或者最后一次对 Statement 部分求值产生 [[Value]] 为 empty 的正常完成,则对 IterationStatement 求值的结果是 [[Value]] 为 undefined 的正常完成。

14.11.2:在 ECMAScript 2015 中,对 WithStatement 求值的结果永远不会是 [[Value]] 为 empty 的正常完成。如果对 WithStatement 的 Statement 部分求值产生 [[Value]] 为 empty 的正常完成,则对 WithStatement 求值的结果是 [[Value]] 为 undefined 的正常完成。

14.12.4:在 ECMAScript 2015 中,对 SwitchStatement 求值的结果永远不会是 [[Value]] 为 empty 的正常完成。如果对 SwitchStatement 的 CaseBlock 部分求值产生 [[Value]] 为 empty 的正常完成,则对 SwitchStatement 求值的结果是 [[Value]] 为 undefined 的正常完成。

14.15:在 ECMAScript 2015 中,如果 Catch 子句包含一个 var 声明,而该声明使用了与 Catch 子句参数相同的 Identifier,则为提前错误。在以前的版本中,此类变量声明会在外层变量环境中实例化,但声明的 Initializer 值会赋给 Catch 参数。

14.15、19.2.1.3:在 ECMAScript 2015 中,如果 Catch 子句对非严格直接 eval 求值,并且其 eval 代码包含绑定与 Catch 子句参数相同 Identifier 的 var 或 FunctionDeclaration 声明,则会抛出运行时 SyntaxError。

14.15.3:在 ECMAScript 2015 中,TryStatement 的结果永远不会是值 empty。如果 TryStatement 的 Block 部分求值为包含 empty 的正常完成,则 TryStatement 的结果是 undefined。如果 TryStatement 的 Block 部分求值为抛出完成,并且其具有求值为包含 empty 的正常完成的 Catch 部分,那么如果不存在 Finally 子句,或者其 Finally 子句求值为 empty 正常完成,则 TryStatement 的结果是 undefined。

15.4.5 在 ECMAScript 2015 中,作为 ObjectLiteral 中访问器属性 [[Getter]] 或 [[Setter]] 特性值创建的函数对象不是构造函数,并且不具有 "prototype" 自有属性。在以前的版本中,它们是构造函数并具有 "prototype" 属性。

20.1.2.6:在 ECMAScript 2015 中,如果 Object.freeze 的参数不是对象,则将其视为没有自有属性的不可扩展普通对象。在以前的版本中,非对象参数始终会导致抛出 TypeError。

20.1.2.8:在 ECMAScript 2015 中,如果 Object.getOwnPropertyDescriptor 的参数不是对象,则尝试使用 ToObject 强制转换该参数。如果转换成功,则使用结果代替原始参数值。在以前的版本中,非对象参数始终会导致抛出 TypeError。

20.1.2.10:在 ECMAScript 2015 中,如果 Object.getOwnPropertyNames 的参数不是对象,则尝试使用 ToObject 强制转换该参数。如果转换成功,则使用结果代替原始参数值。在以前的版本中,非对象参数始终会导致抛出 TypeError。

20.1.2.12:在 ECMAScript 2015 中,如果 Object.getPrototypeOf 的参数不是对象,则尝试使用 ToObject 强制转换该参数。如果转换成功,则使用结果代替原始参数值。在以前的版本中,非对象参数始终会导致抛出 TypeError。

20.1.2.16:在 ECMAScript 2015 中,如果 Object.isExtensible 的参数不是对象,则将其视为没有自有属性的不可扩展普通对象。在以前的版本中,非对象参数始终会导致抛出 TypeError。

20.1.2.17:在 ECMAScript 2015 中,如果 Object.isFrozen 的参数不是对象,则将其视为没有自有属性的不可扩展普通对象。在以前的版本中,非对象参数始终会导致抛出 TypeError。

20.1.2.18:在 ECMAScript 2015 中,如果 Object.isSealed 的参数不是对象,则将其视为没有自有属性的不可扩展普通对象。在以前的版本中,非对象参数始终会导致抛出 TypeError。

20.1.2.19:在 ECMAScript 2015 中,如果 Object.keys 的参数不是对象,则尝试使用 ToObject 强制转换该参数。如果转换成功,则使用结果代替原始参数值。在以前的版本中,非对象参数始终会导致抛出 TypeError。

20.1.2.20:在 ECMAScript 2015 中,如果 Object.preventExtensions 的参数不是对象,则将其视为没有自有属性的不可扩展普通对象。在以前的版本中,非对象参数始终会导致抛出 TypeError。

20.1.2.22:在 ECMAScript 2015 中,如果 Object.seal 的参数不是对象,则将其视为没有自有属性的不可扩展普通对象。在以前的版本中,非对象参数始终会导致抛出 TypeError。

20.2.3.2:在 ECMAScript 2015 中,绑定函数的 [[Prototype]] 内部槽被设置为其目标函数的 [[GetPrototypeOf]] 值。在以前的版本中,[[Prototype]] 始终设置为 %Function.prototype%。

20.2.4.1:在 ECMAScript 2015 中,函数实例的 "length" 属性是可配置的。在以前的版本中它不可配置。

20.5.6.2:在 ECMAScript 2015 中,NativeError 构造函数的 [[Prototype]] 内部槽是 Error 构造函数。在以前的版本中,它是 Function 原型对象。

21.4.4 在 ECMAScript 2015 中,Date 原型对象不是 Date 实例。在以前的版本中,它是 TimeValue 为 NaN 的 Date 实例。

22.1.3.12 在 ECMAScript 2015 中,String.prototype.localeCompare 函数必须将按照 Unicode 标准规范等价的 String 视为相同。在以前的版本中,实现可以忽略规范等价性,并改用按位比较。

22.1.3.28 和 22.1.3.30 在 ECMAScript 2015 中,小写/大写转换处理以码点为单位进行。在以前的版本中,这种转换处理只应用于单个码元。唯一受影响的码点是 Unicode Deseret 区块中的码点。

22.1.3.32 在 ECMAScript 2015 中,String.prototype.trim 方法被定义为识别可能存在于 Unicode BMP 之外的空白码点。不过,截至 Unicode 7 尚未定义此类码点。在以前的版本中,此类码点不会被识别为空白。

22.2.4.1 在 ECMAScript 2015 中,如果 pattern 参数是 RegExp 实例且 flags 参数不是 undefined,则创建一个与 pattern 相同的新 RegExp 实例,但将 pattern 的标志替换为参数 flags。在以前的版本中,当 pattern 是 RegExp 实例且 flags 不是 undefined 时,会抛出 TypeError 异常。

22.2.6 在 ECMAScript 2015 中,RegExp 原型对象不是 RegExp 实例。在以前的版本中,它是模式为空 String 的 RegExp 实例。

22.2.6 在 ECMAScript 2015 中,"source"、"global"、"ignoreCase" 和 "multiline" 是定义在 RegExp 原型对象上的访问器属性。在以前的版本中,它们是定义在 RegExp 实例上的数据属性。

25.4.10:在 ECMAScript 2019 中,Atomics.wake 已重命名为 Atomics.notify,以避免与 Atomics.wait 混淆。

27.1.5.4、27.9.3.6:在 ECMAScript 2019 中,await 入队的 Job 数量减少,这可能会导致 then() 调用与 await 表达式之间的解决顺序出现可观察差异。