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

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

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

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

Q&A

2回答

1289閲覧

イテレータを用いる利点と, イテレータをiterableにする利点とは?

what_is_fff

総合スコア13

JavaScript

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

0グッド

1クリップ

投稿2018/09/27 13:53

前提・実現したいこと

イテレータを使用することのメリット, そして, イテレータをiterableなオブジェクトにすることで得られるメリットは何なのか, 調査していました.

その中で, こちらのサイトにて,

それではなぜ イテレータ が便利なのか、それは for(v of iterable) という構文を使えば、もっと楽に値を取り出せるからです。

との記述を見つけたことをきっかけとして, 生じた疑問です.

発生している問題・エラーメッセージ

先ず, 上に引用した文章ですが, そもそもfor-of構文は, iterableなオブジェクトに対して有効なものであり, 必ずしもイテレータに対してfor-of構文が使用可能, という訳ではないので, イテレータを用いることのメリットを説明出来ているとは, 考えにくいと感じています.

そこで, 質問なのですが, イテレータを使用すること自体にメリットはあるのでしょうか?

また, イテレータをiterableなオブジェクトとすることで得られるメリットは, どのようなものがあるのでしょうか?
iterableなオブジェクトであれば, for-of構文が使用出来る, というメリットがひとつありますが, そのためだけにiterableにする必要があるのか?と疑問に感じます. これ以外に何か, iterableにすることで得られるメリットが, あるのでしょうか?

試したこと

https://qiita.com/kura07/items/cf168a7ea20e8c2554c6
こちらの記事をひととおり読みましたが, この疑問について, 解決しませんでした.

よろしくお願い致します.

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

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

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

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

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

guest

回答2

0

iterable

iterable なオブジェクトの用途は、for-of に限定されません。

  • for-of で反復処理できる
  • SpreadElement で展開できる
  • Rest parameters で展開できる
  • Array.from で配列化できる
  • Map, WeakMap 等の iterable な引数をとる事が出来るビルトイン関数を利用できる

ES2015 以降では既存の標準機能も itrable に合うように再設計されていますので、仕様をよく確認してみて下さい。

イテレータ

イテレータは iterable なオブジェクトを生成する為に利用できます。

イテレータの概念自体は単純なので、ES5以前しか実装されていない実装でも利用できるでしょう。
ECMAScript は基本的に後方互換性に配慮して設計されています。

  • for-of 等の新しい構文は古い実装で利用できません
  • Array.from のPolyfill作成を試みる場合、Symbol.iterator が未実装なら、完全な iterable 判定は不可能ですが、配列や length プロパティを見る等、条件付きで iterable 判定して Polyfill を作る事は可能です

状態の維持

イテレータは状態を維持します。

JavaScript

1const iterator1 = {i: 0, length: 5, next: function next () { return {value: ++this.i, done: this.i >= this.length}; }}; 2const iterable1 = {[Symbol.iterator]: () => { return {i: 0, length: 5, next: function next () { return {value: ++this.i, done: this.i >= this.length}; }}; }}; 3 4while (!iterator1.next().done) console.log('iterator1: not done'); 5for (let v of iterable1) console.log('iterable1:' + v); 6 7while (!iterator1.next().done) console.log('iterator1: not done'); 8for (let v of iterable1) console.log('iterable1:' + v);

周知の事実

質問者さんの中で、考えてみれば、「当たり前の事実」に考えが及んでいない感があります。
「これだけしか違いがないのですか」ではなく、気が付いた「違い」の影響力について深く考察してみる事が足りてないのではないでしょうか。

  • 例えば、イテレータは .next() メソッドを持ちます。関数を持つという事は、bind, call, apply で this 値を変更できるという事です。では、this 値を変更した場合のコード事例は...と考えを勧める事が出来ます。
  • 「もし、iterable なオブジェクトがイテレータだったなら?」で思考実験してみる(その逆はどうかを考えてみる)
  • そもそも、イテレータを使わずに while 文でいいのではないか

最近の回答で「トランポリンとイテレータが似ている」という事実に気が付きました。

トランポリンとイテレータにはどういう違いがあり、メリット/デメリットを総括して、どういう状況でどちらを採用するのが望ましいのか、等を考えてみるのも面白いと思います。

「下手の考え休むに似たり」といいますが、頭の中だけで考えても良い案が思い浮かばず、実際に手を動かして比較コードを書いてみる事で新たな事実に気が付くこともあります。
コードを書いている内に、それが「オブジェクトと関数の違い」や「this 値とは何か」に気が付き、イテレータを構成しているオブジェクトの性質上の違いから「イテレータとiterableの違い」に気が付く事もあるかもしれません。

Re: what_is_fff さん

投稿2018/09/28 04:03

think49

総合スコア18162

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

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

0

そもそもfor-of構文は, iterableなオブジェクトに対して有効なものであり, 必ずしもイテレータに対してfor-of構文が使用可能, という訳ではない

ですが、iterable特定の方法を使えばイテレータを生成するオブジェクトなので、イテレータなしにはiterableは存在できません。

イテレータをiterableなオブジェクトとすることで得られるメリットは, どのようなものがあるのでしょうか?

通常、イテレータ自体をiterableにすることはしません。

投稿2018/09/28 00:03

maisumakun

総合スコア145183

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

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

maisumakun

2018/09/28 00:13

JavaScript標準であるイテレータのArray.prototype[Symbol.iterator]も、それ自体の[Symbol.iterator]はundefinedで、iterableではありません。
think49

2018/09/28 02:07

> JavaScript標準であるイテレータのArray.prototype[Symbol.iterator]も、それ自体の[Symbol.iterator]はundefinedで、iterableではありません。 Google Chrome 69.0.3497.100 では、Array.prototype[Symbol.iterator] は undefined ではありませんでした。
maisumakun

2018/09/28 02:19

think49さん>Array.prototype[Symbol.iterator][Symbol.iterator]はundefinedだった、という意味です。
think49

2018/09/28 02:39

To: maisumakunさん なるほど、失礼しました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問