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

イテレータとイテラブルの概要と課題、未来

sosukesuzuki
November 23, 2024
130

 イテレータとイテラブルの概要と課題、未来

JSConf JP 2024

sosukesuzuki

November 23, 2024
Tweet

More Decks by sosukesuzuki

Transcript

  1. 自己紹介 SUZUKI Sosuke ( @__sosukesuzuki ) • ユビー株式会社 プロダクト開発エンジニア •

    筑波大学 情報学群 情報科学類 B4 • WebKit コミッター • Prettier メンテナー
  2. イテレータ・イテラブルの基本 for (const foo of bar) {} の of の右側にArrayを書くことが多

    い。しかし、実際には イテラブル であればどんなオブジェク トでも書くことができる。 Array、Set、Mapなどの組み込みコレクションはイテラブルで あるため、for of 構文で反復して処理できる。
  3. イテレータ・イテラブルの基本 余談 • JavaScriptでは { [symbol]: value } という記法でシンボ ルの値をキーに持つオブジェクトを作れる

    • Symbol.iteratorのようにSymbol.hogeという形をしている のは Well-known Symbolsと呼ばれている。JavaScriptの 様々な隠れ挙動を制御するために使われる特別なシンボル
  4. イテレータ・イテラブルの基本 ※ この発表では return と throw については触れません。すで に色々な人が日本語で記事を書いてくれているので、そちらを 参照してください: •

    Masaki Hara. 2021. JavaScriptのIterator / Generatorの整理. https://zenn.dev/qnighy/articles/112af47edfda96 • uhyo. 2024. イテレータを分岐させるとどうなる? Iterator Helpersに見 るJavaScriptのイテレータの挙動. https://zenn.dev/uhyo/articles/iterator-helpers-iterator-close
  5. イテレータ・イテラブルの基本 これまでの話を整理すると • for…ofのofの右側にはイテラブルを書ける • ArrayやSetなどはイテラブルである • イテラブルは、Symbol.iterator関数を持つオブジェクトで ある。その関数はイテレータを返す。 •

    イテレータはnext関数を持つオブジェクトである。その関 数は { done: boolean, value: any } の形のオブジェクトを 返す。 • ジェネレータはイテレータかつイテラブルである
  6. 最新、そしてちょっと未来の イテレータ・イテラブル Iterator Helpersの前に、いくつか の前提。 Arrayオブジェクトのイテレータで あるArrayIteratorオブジェクト は、%ArrayIteratorPrototype% を継承する %ArrayIteratorPrototype%

    は%IteratorPrototype%を継承す %ArrayIteratorPrototype% ArrayIterator オブジェクト (イテレータ) Arrayオブジェクト (イテラブル) %IteratorPrototype% Symbol.iterator 継承 継承
  7. 最新、そしてちょっと未来の イテレータ・イテラブル Iterator Helpersプロポーザルは、以下の3つの重要な変更を 加えた: 1. %IteratorPrototype% とそのコンストラクタをグローバ ルに公開した 2.

    %IteratorPrototype% に便利なヘルパー関数を追加した 3. 普通のオブジェクトにあとから %IteratorPrototype% を 継承させる方法を提供した
  8. 最新、そしてちょっと未来の イテレータ・イテラブル ということで、いくつかのプロポーザルがある • Iterator.zip (Stage 2.7) https://github.com/tc39/proposal-joint-iteration • Iterator.concat

    (Stage 2.7) https://github.com/tc39/proposal-iterator-sequencing • Async Iterator Helpers (Stage 2) https://github.com/tc39/proposal-async-iterator-helpers • Iterator.range (Stage 2) https://github.com/tc39/proposal-iterator.range • Iterator chunking (Stage 2) https://github.com/tc39/proposal-iterator.range
  9. まとめ • 最近のJavaScriptには、Iterator.prototype にいろんなヘ ルパーが追加されている。 ◦ 自分のオリジナルイテレータに Iterator.prototype を 継承させれば(Iterator.from

    や Iterator コンストラク タによって)ヘルパーを使える。 • 他にも新たなヘルパーを追加するプロポーザルがアクティ ブに動いている。