このページ内容は2022年9月9日以降、再調査・再検証してません。実際に扱う際は最新の情報にアクセスしてください。
ES2022の仕様が確定したので、どういう機能が入ったか紹介しておきますes2022。ちなみに、ChromeやFirefox, Microsoft Edgeの最新版では対応済みだそうですes2022_browser_support。今回は量が多いので、クラスに関するものは省略します。
これは module形式 (.mjsファイルやpackage.jsonのtypeがmoduleのもの) のJavaScriptに有効な機能で、ファイルのトップレベル (async関数なし) でawaitが使える機能ですes2022_top_level_await。ちなみに、Node.jsの場合はv14.8.0 (2020.8リリース) から利用できる機能で、AWS Lambda Node.js 14のランタイムでも今年から利用可能になりました。
従来は以下のように、async関数内でしかawaitを使えませんでした。
1// 例12const test = async () => {3await promiseFunction()4}56test()78// 例2 (即時関数を使うやり方)9(async () => {10await promiseFunction()11})()
それが以下のようにasyncなしで書けるようになりました。ちなみに、AWS LambdaではProvisioned Concurrencyと組み合わせることで、ユーザーのアクセスがある前にあらかじめ初期化を実施しておき、コールドスタートのレイテンシーを下げることができるようですlambda_top_level_await。
1await promiseFunction()
これは正規表現に合致した文字列のインデックス情報を取得するためのフラグですes2022_regex_index。例えば、d
フラグを利用しないで正規表現を使うとこのようになります。正規表現に合致するプログラマー
という文字列が何文字目から始まるか分からないです。
1// dフラグを付与しない場合2const whatJobRegExp = /職業は(?<job>.*)です/u;34const myJob = whatJobRegExp.exec('職業はプログラマーです');56myJob7// [8// '職業はプログラマーです', 'プログラマー'9// groups: { job: 'プログラマー' }10// index: 0,11// input: '職業はプログラマーです'12// ]
dフラグを使うと、正規表現に合致した文字列が何文字目から始まるか分かるようになります。
1// dフラグを付与した場合2const whatJobRegExp = /職業は(?<job>.*)です/ud;34const myJob = whatJobRegExp.exec('職業はプログラマーです');56myJob7// indicesが追加され、正規表現に合致した文字列が何文字目から始まり終わるかを取得できる8// [9// '職業はプログラマーです', 'プログラマー'10// groups: { job: 'プログラマー' }11// index: 0,12// indices: [13// [0, 11],14// [3, 9],15// groups: {16// job: [3, 9]17// }18// ]19// input: '職業はプログラマーです'20// ]
これは配列の何番目の要素を返したいか指定できるメソッドですes2022_array_at。負の値にすると、配列の後ろから数えて要素を返し、指定する数が要素の数より大きいと、undefinedになります。
1const array = ["ク", "エ", "タ"]23console.log(array.at(0)) // => ク4console.log(array.at(1)) // => エ5console.log(array.at(-1)) // => タ67console.log(array.at(4)) // => undefined
このメソッドにより、配列の最後の要素を返すのが簡単になりました。
1// 以下2つは同じものを返す2array[array.length - 1]3array.at(-1)
これはhasOwnPropertyと同じもので、オブジェクトが任意のプロパティを持っているかどうかを調べるためのメソッドですes2022_hasown。例えば、従来だと以下のように書いてました。
1let foo = { bar: 'Here be dragons' };23// 従来の使い方4Object.prototype.hasOwnProperty.call(foo, 'bar'); // true5Object.prototype.hasOwnProperty.call(foo, 'baz'); // false
hasOwnを使うと以下のようになります。
1let foo = { bar: 'Here be dragons' };23Object.hasOwn(foo, "bar"); // true4Object.hasOwn(foo, "baz"); // false
これはErrorをthrowするときに、エラーの発生理由を付け加えることができるオプションですes2022_error_cause。
1const errorFunction = () => {2try {3a.b4} catch (error) {5// ここでエラー理由を付け足す6throw new Error("エラー!!", { cause: error })7}8}910// 実際にエラーを発生させる11try {12errorFunction()13} catch (error) {14console.log(error) // => Error: エラー!!15// error.causeでerrorFunction()内でcatchされたエラーをcauseとして表示16console.log(error.cause) // => ReferenceError: a is not defined17}