質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

1回答

2078閲覧

ES6 に汎用的な Iterator を生成するメソッドは存在するのか

think49

総合スコア18162

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

0クリップ

投稿2015/08/15 01:18

ES6 で追加策定された WeakMap([iterable]) は Iterator を引数に取れます。

JavaScript

1var obj = {}, 2 wm = new WeakMap([[obj, 'hoge']]); 3 4wm.has(obj); // true

Q1. ES6 に汎用的な Iterator を生成するメソッドは用意されているのでしょうか。

Q2. 配列ではなく、Iterator を扱えるメリットにはどんなものがあるでしょうか。
WeakMap の引数は Iterator でなくとも、配列初期化子 で代替できますが、Iterator を渡せるメリットを想像できませんでした。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

WeakMapが受け取るのはIteratorではなく、iterableですね。一般的にiteratorを返せるインターフェースがあるオブジェクトの事をiterableと呼びます。

Q1. ES6 に汎用的な Iterator を生成するメソッドは用意されているのでしょうか。

特に用意されていないと思います。

Mozillaのドキュメント(Iteration protocols)ではプロトコルと呼んでいますが、「特定の名前で特定のインターフェースをもったオブジェクトを返す事」を僕はMozillaのドキュメントではプロトコルと表現しているように思います。
なので、汎用のメソッドを用意する、と言うよりはIteration protocolに従った実装を作れば for..of文で利用できます。

nextメソッドでIteratorインタフェースを実装したオブジェクトを返すように実装してください。

Q2. 配列ではなく、Iterator を扱えるメリットにはどんなものがあるでしょうか。

MapなどもIteratorですが、Mapが保持するオブジェクトそれぞれにアクセスできるのがIteratorの利点です。デザインパターンで言うIteratorパターンです。先ほど書いたfor..of文で利用できるオブジェクトを作成できるのがメリットです。

参考: Mozillaのドキュメント(Iteration protocols)

投稿2015/08/15 02:07

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

think49

2015/08/15 12:10

回答ありがとうございます。 やはり、汎用の Iterator 生成メソッドはないのですか…。 正直なところ、Firefox 実装の Iterator() のような便利メソッドがある事を期待していました。自前で作るしかないようなのでちょっと考えてみます。 for-of を使えるのが Iterator の利点との事ですが、配列も Iterator として機能するので Iterator ならではのメリットがよくわからないと感じていました。 独自の Iterator を作る方が配列よりも好ましい状況はあるのでしょうか。
退会済みユーザー

退会済みユーザー

2015/08/15 14:47

データ構造的に配列で十分だったら配列使えばいいですが、Mapなど他のデータ構造を選択肢として選べるのが利点ではないでしょうか?独自のIteratorはもし必要だったら選択すればよいだけであって、既存のものでいいならそれを選べばいいのです。
think49

2015/08/17 00:54

選択子が増えたと考えれば確かにそうですね。 「Iteratorが必要な時」というのが私には想定出来なかったのですが、こちらについてはもう少し調べて必要であれば改めて質問したいと思います。 ありがとうございました。
退会済みユーザー

退会済みユーザー

2015/08/17 01:20

補足すると、「Iteratorが必要な時」とは、言い換えれば「ある集合の要素それぞれに対して処理を行いたい時」です。デザインパターンのIteratorパターンです。 ES6もそうですが、最近のプログラミング言語であれば、配列やリスト、SetやMapの機能として実現されているので、自分で実装することはそれほど多くないです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問