Upgrade to Pro — share decks privately, control downloads, hide ads and more …

ES2021/2022

 ES2021/2022

kiyoshi yamashita

September 09, 2022
Tweet

More Decks by kiyoshi yamashita

Other Decks in Programming

Transcript

  1. Promise.anyとPromise.raceの違い Promise.any - 引数のPromiseが最初にresolveした時点で終了 Promise.race - 引数のPromiseが最初にresolveかrejectした時点で終了 - 使いどころとしては長いリクエストを送る場合などに、タイムアウト機能を実装するとき (一定時間たったらrejectを返すようにする)など

    const promise1 = new Promise((_,reject) => setTimeout(reject, 10, 'quick_reject')); const promise2 = new Promise((resolve) => setTimeout(resolve, 100, 'quick_resolve')); const promise3 = new Promise((resolve) => setTimeout(resolve, 500, 'slow_resolve')); const promises = [promise1, promise2, promise3]; Promise.race(promises).then((value) => console.log(value)).catch((error) => { console.log(error) }); // rejectが一番初めに解決されるpromise1のquick_rejectが出力される
  2. Null合体代入 構文:a??=b Null合体代入では左辺aがnullish(nullまたはundefined)の場合に右の値bを代入する。 この構文を使うことで、初期値を設定するときに余計な分岐が不要になり実装がスッキリす る。 const a = { duration:

    50 }; a.duration ??= 10; console.log(a.duration); // 50が出力される a.speed ??= 25; console.log(a.speed); // 25が出力される aがnullish aがnullishではない aに代入される値 b 代入されない
  3. 論理和代入 構文:a||=b aがfalsyな場合に、aにbを代入する。 let a = 0; a ||= 10;

    // aはfalsyな値なので10が代入される console.log(a); // 10が出力される let b = 1 b ||= 10; // bはtruthyな値なので代入されない console.log(b); // 1が出力される 参考:https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Operators/Logical_OR_assignment aがtruthy aがfalsy aに代入される値 代入されない b
  4. 論理積代入 構文:a&&=b 左辺の値aがtruthyな場合に、左辺の値aに右辺の値bを代入する。 let a = 1; a &&= 2;

    // aはtruthyな値なので2が代入される console.log(a); // 2 が出力される let b = 0; b &&= 2; // 0はfalsyな値なので代入が行われない console.log(b); // 0 が出力される 参考:https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Operators/Logical_AND_assignment aがtruthy aがfalsy aに代入される値 b 代入されない
  5. Class Fields これまでクラスフィールドを作りたいときはconstructor内で宣言するしかなかった。 ES2022からクラスフィールドが定義できるようになった。 // これまでの書き方 class HogeCounter { constructor

    () { this.count = 0; } } // 新しい書き方 class HigeCounter { // publicなクラスフィールド count = 0; } 参考:https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Classes/Public_class_fields
  6. Private Fields ES2022 からprivateフィールドやメソッドも使えるようになった。 privateフィールドには接頭辞に#を付ける。privateフィールドは外部からアクセ スできずに、アクセスしようとすると構文エラーが発生する。 class HogeCounter { #count;

    //privateなクラスフィールド constructor(count) { this.#count = count; } // privateなメソッドも作成可能 #doubleCount() { return this.#count * 2; } echoCount() { console .log(this.#doubleCount ()); } } const object = new HogeCounter(10); object.echoCount(); //20が出力される 参考:https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Classes/Private_class_fields
  7. Static Fields ES2022から静的なクラスフィールドやメソッドが使えるようになった。 staticなフィールドやメソッドはインスタンス化なしで使うことが出来る。 class HogeCounter { static count =

    10; static echoDoubleCount () { console.log(this.count*2); } } console.log(HogeCounter.count); console.log(HogeCounter.echoDoubleCount ()); 参考:https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Classes/static#calling_static_members_from_a_class_constructor_and_other_methods
  8. Top Level await これまではawaitが書けるのはasync関数の中だけだった。async関数の外でもawait 式が書けるようになった。 ただし、関数内では今まで通りasyncが必要。 // NG:関数ではasyncが必要 function hoge()

    { return await hige(); } // OK const result = await hoge(); 参考:https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Operators/await#%E6%9C%80%E4%B8%8A%E4%BD%8D%E3%81%AE_await
  9. Top Level awaitの実行順序 Top Level awaitを使うと実行順序が複雑になる。 Top Level awaitを使用しているファイル全体が1つの非同期関数のように機能する。 //

    非同期関数内でawaitを使う場合 console.log("1"); (async () => { await new Promise(resolve => setTimeout((resolve), 3000)) console.log("3") })() console.log("2") モジュールの実行順序への影響:https://qiita.com/uhyo/items/0e2e9eaa30ec2ff05260 // Top Level awaitの場合 console.log("1"); await new Promise(resolve => setTimeout(resolve, 3000)) // await式の評価が終わってから実行される console.log("2")
  10. Object.hasOwn() Object.hasOwn(オブジェクト,プロパティ) オブジェクトが指定のプロパティを持っているかを真偽値で返す。 class Hoge { hige = 1; }

    const hoge = new Hoge(); console.log(Object.hasOwn(hoge, "hige")) // true が返される 参考:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/hasOwn
  11. (復習) RegExp Named Capture Groups ES2018から正規表現で?<グループ名>とすることで、マッチした部分にグルー プ名をつけることが出来るようになった。 const regrex =

    /好きな食べ物は(?<favFood>.*)です/; const hoge = '好きな食べ物は焼肉 🍖です。'.match(regrex); // グループ名でマッチした部分を取得できる console.log(hoge.groups.favFood) // 焼肉🍖が出力される 参考:https://developer.mozilla.org/ja/docs/Web/JavaScript/Guide/Regular_Expressions/Groups_and_Backreferences
  12. RegExp Match Indices 正規表現にdフラグを付けることで、indicesプロパティでマッチした文字列の開 始・終了位置を取得できる。 indices:[開始位置, 終了位置]のように配列形式で格納される。 const regrex =

    /好きな食べ物は(?<favFood>.*)です/d; const hoge = '好きな食べ物は焼肉 🍖です。'.match(regrex); console.log(hoge.indices.groups.favFood) // 焼肉🍖の開始・終了インデックスである [7,11]が出力される 参考:https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/RegExp/exec
  13. Error Cause エラーが連鎖した場合に、そのエラーの親となるエラーを.causeで辿れる。 親子関係のあるコードで、エラーの発生源を辿るのに便利。 try{ try{ try{ throw new Error('Error1'

    ); } catch(e){ throw new Error('Error2' , {cause: e}); } }catch(e){ throw new Error('Error3' , {cause: e}); } }catch(e){ console .log(e); // Error3 console .log(e.cause); // Error2 console .log(e.cause.cause); // Error1 } 参考:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error/cause