Annex F (informative) 引入与先前版本不兼容的新增和更改

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

7.1.4.1:在 ECMAScript 2015 中,应用于 String 值的 ToNumber 现在会识别并转换 BinaryIntegerLiteralOctalIntegerLiteral 数值字符串。在先前版本中,这类字符串会被转换为 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) 类别移动到 Format (Cf) 类别(自 Unicode 6.3.0 起),而它在 ECMAScript 2015 中被视为空白。这会导致对空白敏感的方法表现不同。例如,"\u180E".trim().length 在先前版本中为 0,但在 ECMAScript 2016 及以后版本中为 1。此外,ECMAScript 2017 强制要求始终使用 Unicode 标准的最新版本。

12.7:在 ECMAScript 2015 中,IdentifierName 的有效码点是根据 Unicode 属性 “ID_Start” 和 “ID_Continue” 指定的。在先前版本中,有效的 IdentifierNameIdentifier 码点通过枚举各种 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 中,以标记 let 开头,后跟输入元素 LineTerminator 再后跟 IdentifierStatementListLexicalDeclaration 的开始。在先前版本中,自动分号插入总会在 Identifier 输入元素之前插入分号。

14.5:在 ECMAScript 2015 中,以标记 let 开头,后跟标记 [StatementListItemLexicalDeclaration 的开始。在先前版本中,这样的序列会是 ExpressionStatement 的开始。

14.6.2:在 ECMAScript 2015 中,IfStatement 的 normal 结果永远不是值 empty。如果没有 Statement 部分被求值,或者被求值的 Statement 部分产生包含 empty 的 normal completion,则 IfStatement 的结果是 undefined

14.7:在 ECMAScript 2015 中,如果 for 语句的 ( 标记后紧跟标记序列 let [,则该 let 被视为 LexicalDeclaration 的开始。在先前版本中,这样的标记序列会是 Expression 的开始。

14.7:在 ECMAScript 2015 中,如果 for-in 语句的 ( 标记后紧跟标记序列 let [,则该 let 被视为 ForDeclaration 的开始。在先前版本中,这样的标记序列会是 LeftHandSideExpression 的开始。

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

14.7:在 ECMAScript 2015 中,对 IterationStatement 求值的结果永远不会是其 [[Value]]empty 的 normal completion。如果 IterationStatementStatement 部分未被求值,或者 Statement 部分的最终求值产生其 [[Value]]empty 的 normal completion,则对 IterationStatement 求值的结果是其 [[Value]]undefined 的 normal completion。

14.11.2:在 ECMAScript 2015 中,对 WithStatement 求值的结果永远不会是其 [[Value]]empty 的 normal completion。如果 WithStatementStatement 部分求值产生其 [[Value]]empty 的 normal completion,则对 WithStatement 求值的结果是其 [[Value]]undefined 的 normal completion。

14.12.4:在 ECMAScript 2015 中,对 SwitchStatement 求值的结果永远不会是其 [[Value]]empty 的 normal completion。如果 SwitchStatementCaseBlock 部分求值产生其 [[Value]]empty 的 normal completion,则对 SwitchStatement 求值的结果是其 [[Value]]undefined 的 normal completion。

14.15:在 ECMAScript 2015 中,Catch 子句包含一个与 Catch 子句参数相同 Identifiervar 声明是早期错误。在先前版本中,这样的变量声明会在外围变量环境中实例化,但该声明的 Initializer 值会赋给 Catch 参数。

14.1519.2.1.3:在 ECMAScript 2015 中,如果 Catch 子句求值一个非严格直接 eval,且其 eval 代码包含绑定与 Catch 子句参数相同 IdentifiervarFunctionDeclaration 声明,则会抛出运行时 SyntaxError

14.15.3:在 ECMAScript 2015 中,TryStatement 的结果永远不是值 empty。如果 TryStatementBlock 部分求值为包含 empty 的 normal completion,则 TryStatement 的结果是 undefined。如果 TryStatementBlock 部分求值为 throw completion,并且它有一个 Catch 部分求值为包含 empty 的 normal completion,则在没有 Finally 子句或其 Finally 子句求值为 empty normal completion 时,TryStatement 的结果是 undefined

15.4.5 在 ECMAScript 2015 中,作为 ObjectLiteral访问器属性 [[Get]][[Set]] 特性值创建的函数对象不是构造器函数,并且它们没有 "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.2822.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,则会创建一个新的 RegExp 实例,它与 pattern 相同,但 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.15:在 ECMAScript 2019 中,Atomics.wake 已重命名为 Atomics.notify,以避免与 Atomics.wait 混淆。

27.1.5.427.6.3.6:在 ECMAScript 2019 中,await 入队的 Job 数量被减少,这可能在 then() 调用和 await 表达式之间的解析顺序上产生可观察差异。