別にしんどくないブログ

技術のことや読書メモを書いています

Node.js v12で使えるJavaScriptの新機能

Node.js v12が4/23にリリースされました 🚀

Node.jsのCoreにも新しい機能が入りました。 また、APIの追加以外にもTLS1.3のサポートやhttp_parserがllhttpに代わったりしています。 詳しくは以下をご覧ください!

github.com

JavaScriptエンジンであるV8もバージョンアップしています。
Node.js v10のV8のバージョンは6.8でしたが、Node.js v12では7.4に大幅アップデートしています。
V8のバージョンが上がることによりJavaScriptの使える機能や構文が増えます。
今回はMathias氏のツイートをもとにNode.js v12から使えるJavaScript(ECMAScript)の新機能について紹介したいと思います。

一部v11から使える機能もあります。
掲載しているコードはすべてv12.0.0で動作確認済です。

Array#flat

Array.prototype.flat() - JavaScript | MDN

ネストされた配列をフラットにします。以下MDNから引用です。

この機能はv11.14.0でも使えました。

Array#flatMap

Array.prototype.flatMap() - JavaScript | MDN

配列の値をmap関数でマッピングし、結果の配列をフラット化します。以下MDNから引用です。

この機能もv11.14.0で動作しました。

class fields

Classの中でプライベートフィールドが使えるようになります。 class fieldsについては以下の記事が参考になると思います。

developers.google.com

また、#が使われるようになった経緯をJxckさんが詳しく解説してくれています。

blog.jxck.io

動作確認済のコードは以下のとおりです。

コメントアウトしている箇所のようにプライベートフィールドの#countにアクセスするとエラーになります。

globalThis

globalThis - JavaScript | MDN

GitHub - tc39/proposal-global: ECMAScript Proposal, specs, and reference implementation for `global`

globalThisは環境を超えてグローバルオブジェクトにアクセスするためのオブジェクトです。
これまでブラウザではwindow、Node.jsではglobalがグローバルオブジェクトとして使われていました。
もちろんこれらは今まで通り各環境で使えますが、どちらでもアクセス可能なオブジェクトとしてglobalThisが追加されました。
globalThisを使うことで以下のような使い分けをする必要がなくなりました。

以下の記事も参考になるかと思います。

👻globalThis👻と🌏global🌏と🌝this🌝 - Qiita

Intl.ListFormat

Intl.ListFormat - JavaScript | MDN

配列を国ごとに形式を変えて文字列フォーマットしてくれるIntlの新しいAPIです。

Intl.Locale

GitHub - tc39/proposal-intl-locale: `Intl.Locale` specification [draft]

Intl.Locale

第一引数の文字列"pl-u-hc-h12"UNICODE LOCALE DATA MARKUP LANGUAGEで定義されている形式に沿って記述します。最初のplは言語を表しています。英語であればenです。uunicodeであること、hcはHour Cycleを表していてhc12は12時間周期であることを表しています。hc12は1〜12、hc23は0〜23といった具合です。例えば23時をフォーマットするときにhh:mm形式を指定すると11:00となり12時間周期にフォーマットされ、HH:mm23:00と0〜23時の形式にフォーマットされます。hh:mmhc12HH:mmhc23の形式を使っていることになります。

UTS #35: Unicode Locale Data Markup Language

Intl.RelativeTimeFormat

Intl.RelativeTimeFormat - JavaScript | MDN

これは言語によって時間表記を変換してくれる国際化APIです。
以下のコードを見るとわかるかと思いますが、jaを指定してformat関数に2日後を指定すると文字列"明後日"に変換してくれます。

Object.fromEntries

Object.fromEntries() - JavaScript | MDN

key, valueのペアの配列をオブジェクトに変換します。

stable Array#sort

v8.dev

Arrayのsortが安定ソートになりました。

安定ソート - Wikipedia

String#matchAll

String.prototype.matchAll() - JavaScript | MDN

正規表現にマッチするものをすべて取り出して配列にします。キャプチャした値も配列の中に含まれます。

Symbol#description

Symbol.prototype.description - JavaScript | MDN

Symbolの引数に指定した値を参照することができます。descriptionプロパティは読み取り専用です。

well-formed JSON.stringify

GitHub - tc39/proposal-well-formed-stringify: Proposal to prevent JSON.stringify from returning ill-formed strings

不正なサロゲートペアがエスケープされた文字列として出力されるようになります。

以前までは

JSON.stringify("\uD800");
// --> '"�"'

だったのが

JSON.stringify("\uD800");
// --> '"\ud800"'

になります。

最後に

今回はJavaScript(ECMAScript)の新機能を紹介しましたが、冒頭でも触れたようにNode.jsのCoreにも様々な変更が入っています。 v12がLTSになるのは10月末を予定しています。

github.com

以上、最後までお読みいただきありがとうございました。
不備や質問などがありましたらブコメとかTwitterまでお願いいたします。