Annex F (informative) 従来版との非互換を導入する追加および変更
6.2.5: ECMAScript 2015 では関数呼び出しは Reference Record を返すことができない。
7.1.4.1: ECMAScript 2015 では String 値への ToNumber が BinaryIntegerLiteral と OctalIntegerLiteral の数値文字列を認識して変換する。以前はそれらは NaN へ変換されていた。
9.3: ECMAScript 2018 ではテンプレートオブジェクトは以前のように Realm 内の全出現横断ではなく Parse Node(ソース位置)に基づき正規化される。
12.2: ECMAScript 2016 では Unicode 8.0.0 以上が必須になり、2015 版の Unicode 5.1 必須から変更された。特に U+180E MONGOLIAN VOWEL SEPARATOR は Space_Separator
(Zs
) から Format
(Cf
) へ移動(Unicode 6.3.0)し、空白としての扱いが変化した。これは空白に敏感なメソッドの挙動差異を生む。例えば以前は "\u180E".trim().length
は 0
だが 2016 以降は 1
。さらに ECMAScript 2017 は常に Unicode 最新版を使用することを義務付けた。
12.7: ECMAScript 2015 では IdentifierName の有効コードポイントを Unicode プロパティ “ID_Start” と “ID_Continue” で規定。以前は様々な Unicode カテゴリ列挙で規定されていた。
12.10.1: ECMAScript 2015 では do-while 文末尾のセミコロンが欠如していると自動セミコロン挿入が追加する。これは実装挙動との整合。
13.2.5.1: ECMAScript 2015 では Object Initializer で重複プロパティ名があっても早期エラーではなくなった。
13.15.1: ECMAScript 2015 では FunctionExpression の関数名のような不変バインディングへの代入を含む strict mode コードは早期エラーではなく実行時エラーを生成する。
14.2: ECMAScript 2015 ではトークン let に続いて入力要素 LineTerminator その後 Identifier で始まる StatementList は LexicalDeclaration の開始。以前は自動セミコロン挿入が常に Identifier 前にセミコロンを挿入した。
14.5: ECMAScript 2015 ではトークン let
に続いてトークン [
の並びで始まる StatementListItem は LexicalDeclaration の開始。以前は ExpressionStatement の開始だった。
14.6.2: ECMAScript 2015 では IfStatement の通常結果が empty になることはない。Statement 部分が評価されないか empty を含む通常完了なら結果は 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 の一部として現れ得た。2015 では同位置の ForBinding はそのような初期化子を許さない。2017 では非 strict コードでのみ許容。
14.7: ECMAScript 2015 では IterationStatement の評価結果が [[Value]] empty の通常完了になることはない。Statement 部分が評価されないか最終評価が empty の場合結果は undefined。
14.11.2: ECMAScript 2015 では WithStatement の評価結果が empty の通常完了にならない。Statement 部分が empty の通常完了なら結果は undefined。
14.12.4: ECMAScript 2015 では SwitchStatement の評価結果が empty の通常完了にならない。CaseBlock 部分が empty の通常完了なら結果は undefined。
14.15: ECMAScript 2015 では Catch 節がパラメータと同じ Identifier の var
宣言を含むと早期エラー。以前はその変数宣言は囲む variable environment にインスタンス化され初期化子値が Catch パラメータへ代入された。
14.15, 19.2.1.3: ECMAScript 2015 では Catch 節が非 strict の直接 eval
を評価し、その eval コードが Catch パラメータと同じ Identifier をバインドする var
/ FunctionDeclaration
を含むと実行時 SyntaxError を投げる。
14.15.3: ECMAScript 2015 では TryStatement の結果が empty 値になることはない。Block 部分が empty を含む通常完了なら結果は undefined。Block が throw 完了で Catch が empty の通常完了を返し、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 では引数がオブジェクトでない場合 ToObject 変換を試み、成功すればその結果を使用。以前は常に TypeError。
20.1.2.10: 同上の挙動。
20.1.2.12: 同上の挙動。
20.1.2.16: 引数がオブジェクトでない場合、非拡張の空オブジェクトとして扱う。以前は TypeError。
20.1.2.17: 同様。
20.1.2.18: 同様。
20.1.2.19: 引数がオブジェクトでない場合 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 prototype オブジェクト。
21.4.4 ECMAScript 2015 では Date prototype オブジェクトは Date インスタンスではない。以前は TimeValue が NaN の Date インスタンス。
22.1.3.12 ECMAScript 2015 では String.prototype.localeCompare
は Unicode 標準で正規等価な文字列を同一として扱う。以前は正規等価性を無視しビット単位比較も可能だった。
22.1.3.28 および 22.1.3.30 ECMAScript 2015 では大小変換処理はコードポイント単位。以前はコードユニット個別。影響を受けるのは Deseret ブロック。
22.1.3.32 ECMAScript 2015 では String.prototype.trim
は BMP 外に存在し得る空白コードポイントを認識するよう定義(Unicode 7 時点で該当なし)。以前は認識しなかった。
22.2.4.1 ECMAScript 2015 では pattern 引数が RegExp インスタンスで flags が undefined でなければ、新しい RegExp を作成し既存フラグを置換。以前は TypeError。
22.2.6 ECMAScript 2015 では RegExp prototype オブジェクトは RegExp インスタンスではない。以前は空文字パターンのインスタンス。
22.2.6 ECMAScript 2015 では "source", "global", "ignoreCase", "multiline" は RegExp prototype 上のアクセサプロパティ。以前はインスタンス上のデータプロパティ。
25.4.15: ECMAScript 2019 で Atomics.wake
は Atomics.notify
に改名され Atomics.wait
との混同を防ぐ。
27.1.6.4, 27.6.3.6: ECMAScript 2019 で await
によりエンキューされる Job 数が減り、then()
呼び出しと await
式間の解決順序に観測可能な差異を生む可能性がある。