Node.js v12が4/23にリリースされました 🚀
Node.jsのCoreにも新しい機能が入りました。 また、APIの追加以外にもTLS1.3のサポートやhttp_parserがllhttpに代わったりしています。 詳しくは以下をご覧ください!
JavaScriptエンジンであるV8もバージョンアップしています。
Node.js v10のV8のバージョンは6.8でしたが、Node.js v12では7.4に大幅アップデートしています。
V8のバージョンが上がることによりJavaScriptの使える機能や構文が増えます。
今回はMathias氏のツイートをもとにNode.js v12から使えるJavaScript(ECMAScript)の新機能について紹介したいと思います。
New JavaScript features in Node.js v12:
— Mathias Bynens (@mathias) 2019年4月23日
➡️ Array#{flat,flatMap}
➡️ class fields
➡️ globalThis
➡️ Intl.{ListFormat,Locale,RelativeTimeFormat}
➡️ Object.fromEntries
➡️ stable Array#sort
➡️ String#matchAll
➡️ Symbol#description
➡️ well-formed JSON.stringify
一部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については以下の記事が参考になると思います。
また、#
が使われるようになった経緯をJxckさんが詳しく解説してくれています。
動作確認済のコードは以下のとおりです。
コメントアウトしている箇所のようにプライベートフィールドの#count
にアクセスするとエラーになります。
globalThis
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]
第一引数の文字列"pl-u-hc-h12"
はUNICODE LOCALE DATA MARKUP LANGUAGEで定義されている形式に沿って記述します。最初のpl
は言語を表しています。英語であればen
です。u
はunicodeであること、hc
はHour Cycleを表していてhc12
は12時間周期であることを表しています。hc12
は1〜12、hc23
は0〜23といった具合です。例えば23時をフォーマットするときにhh:mm
形式を指定すると11:00
となり12時間周期にフォーマットされ、HH:mm
は23:00
と0〜23時の形式にフォーマットされます。hh:mm
はhc12
、HH:mm
はhc23
の形式を使っていることになります。
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
Arrayのsortが安定ソートになりました。
String#matchAll
String.prototype.matchAll() - JavaScript | MDN
正規表現にマッチするものをすべて取り出して配列にします。キャプチャした値も配列の中に含まれます。
Symbol#description
Symbol.prototype.description - JavaScript | MDN
Symbolの引数に指定した値を参照することができます。descriptionプロパティは読み取り専用です。
well-formed JSON.stringify
不正なサロゲートペアがエスケープされた文字列として出力されるようになります。
以前までは
JSON.stringify("\uD800"); // --> '"�"'
だったのが
JSON.stringify("\uD800"); // --> '"\ud800"'
になります。
最後に
今回はJavaScript(ECMAScript)の新機能を紹介しましたが、冒頭でも触れたようにNode.jsのCoreにも様々な変更が入っています。 v12がLTSになるのは10月末を予定しています。
以上、最後までお読みいただきありがとうございました。
不備や質問などがありましたらブコメとかTwitterまでお願いいたします。