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

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

Sponsored · Your Podcast. Everywhere. Effortlessly. Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
Avatar for sosukesuzuki sosukesuzuki
November 23, 2024
3.8k

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

JSConf JP 2024

Avatar for sosukesuzuki

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