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

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

7.1.4.1:在 ECMAScript 2015 中,对字符串值执行 ToNumber 现在识别并转换 BinaryIntegerLiteralOctalIntegerLiteral 数字字符串。之前版本转换为 NaN

9.3:在 ECMAScript 2018 中,模板对象按 Parse Node(源位置)规范化,而不是如之前版本那样在 Realm 中该模板字面量或标记模板的所有出现之间。

12.2:在 ECMAScript 2016 中,要求 Unicode 8.0.0 或更高,而 ECMAScript 2015 要求 Unicode 5.1。特别地,这导致 U+180E 蒙古元音分隔符从 Space_Separator (Zs) 类别(因此在 ECMAScript 2015 中视为空白)移动到 Format (Cf) 类别(自 Unicode 6.3.0 起)。这导致对空白敏感的方法表现不同。例如,之前版本 "\u180E".trim().length0,在 ECMAScript 2016 及后为 1。此外,ECMAScript 2017 要求始终使用最新 Unicode 标准。

12.7:在 ECMAScript 2015 中,IdentifierName 的有效代码点以 Unicode 属性 “ID_Start” 与 “ID_Continue” 表述。之前版本通过列举各种 Unicode 代码点类别指定有效的 IdentifierNameIdentifier 代码点。

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

13.2.5.1:在 ECMAScript 2015 中,对象初始值设定中出现重复属性名不再是早期错误。

13.15.1:在 ECMAScript 2015 中,严格模式代码中对不可变绑定(如 FunctionExpression 的函数名)的赋值不再产生早期错误,而是产生运行时错误。

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

14.5:在 ECMAScript 2015 中,以 token let 开头后跟 token [StatementListItemLexicalDeclaration 的起始。之前版本该序列会是 ExpressionStatement 的起始。

14.6.2:在 ECMAScript 2015 中,IfStatement 的正常结果不再是值 empty。如果没有求值任何 Statement 部分或求值的 Statement 部分产生包含 empty正常完成,则结果为 undefined

14.7:在 ECMAScript 2015 中,如果 for 语句的 ( token 紧跟 token 序列 let [let 视为 LexicalDeclaration 的起始。之前版本该序列是 Expression 的起始。

14.7:在 ECMAScript 2015 中,如果 for-in 语句的 ( token 紧跟 token 序列 let [let 视为 ForDeclaration 的起始。之前版本该序列是 LeftHandSideExpression 的起始。

14.7:在 ECMAScript 2015 之前,初始化表达式可出现在紧接 in 关键字之前的 VariableDeclaration 中。ECMAScript 2015 中相同位置的 ForBinding 不允许此初始化器出现。ECMAScript 2017 中,此初始化器仅在非严格代码中允许。

14.7:在 ECMAScript 2015 中,对 IterationStatement 的求值结果不再是 [[Value]]empty正常完成。若其 Statement 部分未被求值或最终求值结果为 [[Value]]empty正常完成,则结果为 [[Value]]undefined正常完成

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

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

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

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

14.15.3:在 ECMAScript 2015 中,TryStatement 的结果不再是值 empty。如果其 Block 部分求值为包含 empty正常完成,则结果为 undefined。如果 Block 部分求值为抛出完成,且其 Catch 部分求值为包含 empty正常完成,在没有 Finally 子句或 Finally 子句求值为 empty 正常完成时结果为 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:同上。

20.1.2.12:同上。

20.1.2.16:在 ECMAScript 2015 中,非对象参数按无自有属性的不可扩展普通对象处理。之前版本抛出 TypeError

20.1.2.17:同上。

20.1.2.18:同上。

20.1.2.19:在 ECMAScript 2015 中,非对象参数尝试 ToObject 成功则使用结果。之前版本抛出 TypeError

20.1.2.20:非对象参数按不可扩展空对象处理。之前版本抛出 TypeError

20.1.2.22:同上。

20.2.3.2:在 ECMAScript 2015 中,绑定函数的 [[Prototype]] 内部槽设为其目标函数的 [[GetPrototypeOf]] 值。之前版本始终设为 %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 标准下规范等价的字符串视为相同。之前版本允许忽略规范等价,使用按位比较。

22.1.3.2822.1.3.30:在 ECMAScript 2015 中,大小写转换处理基于代码点。之前版本仅对单个代码单元。受影响的代码点仅在 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 相同但标志为 flags。之前版本当 pattern 为 RegExp 且 flagsundefined 时抛出 TypeError

22.2.6:在 ECMAScript 2015 中,RegExp 原型对象不是 RegExp 实例。之前版本它是模式为空字符串的 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.6.4, 27.6.3.6:在 ECMAScript 2019 中,await 入队的作业数量减少,可能在 then() 调用与 await 表达式之间创建可观察到的解析顺序差异。