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

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

7.1.4.1:在 ECMAScript 2015 中,应用于 String 值的 ToNumber 现在会识别并转换 BinaryIntegerLiteralOctalIntegerLiteral 数值字符串。在先前版本中,这类字符串会被转换为 NaN

9.3:在 ECMAScript 2018 中,Template 对象基于 Parse Node(源位置)规范化,而不是像先前版本中那样,在一个 Realm 内跨该模板字面量或 tagged template 的所有出现进行规范化。

12.2:在 ECMAScript 2016 中,强制要求 Unicode 8.0.0 或更高版本,而 ECMAScript 2015 强制要求 Unicode 5.1。特别是,这导致 U+180E MONGOLIAN VOWEL SEPARATOR 从 Space_SeparatorZs)类别移到 FormatCf)类别(自 Unicode 6.3.0 起),该字符在 ECMAScript 2015 中因此被视为空白。这会导致空白敏感方法的行为不同。例如,"\u180E".trim().length 在先前版本中为 0,但在 ECMAScript 2016 及更高版本中为 1。此外,ECMAScript 2017 强制要求始终使用 Unicode Standard 的最新版本。

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 中,对象初始化器中具有重复属性名不再是早期错误

13.15.1:在 ECMAScript 2015 中,包含对不可变绑定(例如 FunctionExpression 的函数名)赋值的严格模式代码不会产生早期错误。相反,它会产生运行时错误。

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

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

14.6.2:在 ECMAScript 2015 中,IfStatement 的正常结果永远不是值 empty。如果没有求值任何 Statement 部分,或求值的 Statement 部分产生包含 empty 的 normal completion,则 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 的 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 子句参数中出现的同一 Identifier 对应的 var 声明,则为早期错误。在先前版本中,这种变量声明会在外围变量环境中实例化,但声明的 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,并且它具有求值为包含 empty 的 normal completion 的 Catch 部分,那么如果没有 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 中,bound function 的 [[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 Standard 规范等价的 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.10:在 ECMAScript 2019 中,Atomics.wake 被重命名为 Atomics.notify,以避免与 Atomics.wait 混淆。

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