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

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

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

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

Q&A

解決済

2回答

5692閲覧

iterableとは何なのか?

what_is_fff

総合スコア13

JavaScript

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

1グッド

2クリップ

投稿2018/09/26 08:30

編集2018/09/26 08:36

前提・実現したいこと

JavaScriptでイテレータ, ジェネレータを使ったプログラムを学習しました.
このうちイテレータについての質問です.
先ず, 私の理解している部分の共有のため,イテレータ, ジェネレータ, iterableの説明を記述致します.

イテレータ

次の要素を返す関数を持ち, その関数の返り値として, 次の要素の値と, その要素でイテレータが終了するかの真偽値を返すオブジェクトを指す. イテレータは, iterableではない.

ジェネレータ

function*により, ジェネレータを用いた関数を定義できる. その関数を定義すると, その返り値として, Generatorオブジェクトが返される. Generatorオブジェクトはイテレータである. Generatorオブジェクトの持つ関数を実行すると, yield式が出現するまで処理を継続する. そして, yield式が出現した時点で処理を停止し, 再び該当Generatorオブジェクトの関数が呼び出されるまでの間, 後続処理を行わない. ジェネレータは, Symbol.iteratorをキーとした関数を持つため, iterableである.

iterable

Symbol.iteratorをキーとした関数を持ち, for-of構文を用いることで反復処理が可能なオブジェクトを指す.

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

  • Symbol.iteratorプロパティとは何をしているのか?
  • イテレータとiterableには, どのような関係があるのか?

といった所が, 理解出来ずにいます.

for-of構文とは, __イテレータの中身を1つずつ取り出し, 取り出されたオブジェクトに対して, 処理を行うことが出来る文__なので, イテレータであればfor-of構文で実行可能なのではないか, と考えていました. しかし, 実際の所は, イテレータであるだけでなく, iterableでなければありません.

またイテレータは, 次の要素と, その要素でイテレータが終了するかを返します. そのため, for構文while構文を用いることで, 反復処理が可能な筈なので, iterableではないか, と考えました. しかし, これはfor-of構文で処理を行えないため, iterableとは言えません. イテレータをiterableにするには, Symbol.iteratorプロパティを実装しなければなりません. ではいったい, このSymbol.iteratorプロパティではどのような処理をしているのか?という所を, 教えて頂きたいです.

JAvaScript

1let iter = { 2 index: 0, 3 next: function () { 4 this.index += 1; 5 return { 6 value: this.index, 7 done: false 8 } 9 } 10}; 11 12for (let i = 0; i < 100; i++) { 13 console.log(iter5.next().value); 14} 15 16for (it of iter) { 17 console.log(it.value); // => TypeError: iter is not iterable 18}

補足情報(FW/ツールのバージョンなど)

以下に記載したウェブサイトにて, __Symbol.iteratorプロパティとは何をしているのか?__を調査しましたが, Symbol.iteratorプロパティの内部で, 新たにジェネレータ(イテレータ)を用いているソースコードを発見し, 通常のイテレータと, それに実装するSymbol.iteratorプロパティの関係(イテレータとiterableの関係)について, 混乱してしまい, 今回の質問をするまでに至りました.
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Symbol/iterator

m.ts10806👍を押しています

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

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

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

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

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

guest

回答2

0

ベストアンサー

こちらの記事が比較的わかりやすかったですが、「イテレーター」と「iterable」は響きが似ていますが異なる概念です。

しかし, 実際の所は, イテレータであるだけでなく, iterableでなければありません.

イテレータである必要はありません。

> Symbol.iteratorプロパティとは何をしているのか?

.toString()が文字列を返すように、[Symbol.iterator]()メソッドはイテレーターを返します。後付でJavaScriptを拡張したので普通の名前ではないのですが、Symbol.iteratorメソッドの名前と考えてください。

イテレータとiterableには, どのような関係があるのか?

[Symbol.iterator]()メソッドを実行すればイテレーターを返すオブジェクトがiterableです。Arrayを筆頭に、iterableそのものはイテレータでなくて構いません。

投稿2018/09/26 08:35

編集2018/09/26 08:39
maisumakun

総合スコア145121

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

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

what_is_fff

2018/09/26 09:54 編集

記事のご紹介, ありがとうございます. じっくりと読ませていただきます. > イテレータである必要はありません。 改めて調査すると, `for-of構文`は, **iterableなオブジェクトに対して, 反復処理を行う**文だとわかりました. そのため, そもそも__イテレータであれば, `for-of構文`で反復処理が可能__という所から, 間違えてしまっていた, ということになりますね. ご指摘ありがとうございます. > [Symbol.iterator]()メソッドはイテレーターを返します なるほど, `Symbol.iteratorプロパティ`に代入された関数は, 「イテレータを返す」ためにあるのですね(例えるなら, ゲッターのようなものでしょうか). > iterableそのものはイテレータでなくて構いません 結果としてイテレータを返すものであれば, 仰るとおり, `Symbol.iteratorプロパティ`自体はイテレータでなくても良いですね. `Symbol.iteratorプロパティ`内の関数も, ただの関数なので, イテレータを返す処理にイテレータを使う, といったことも出来るため, 「イテレータであっても, そうでなくても良い」というところでしょうか. 上記を踏まえて, 2点, 質問をしたいです. 1. __`Symbol.iteratorプロパティ`はイテレータを返す__ のであれば, 直接イテレータを扱うことと, `Symbol.iteratorプロパティ`経由でイテレータを扱うことは, 同じことに思えますが, `for-of構文`の使用可否以外に, この2つで異なる点がありますでしょうか? 後者は, オブジェクトをひとつ介しているので, その分出来ることが広がりそうに感じましたが, これという具体例は見つかりませんでした. ~~2. `for-of構文`で直接イテレータを処理しようとすると, エラーが発生してしまうのは, **`for-of構文`では, `Symbol.iteratorプロパティ`でイテレータを取得しているから**, だと考えたのですが, 私の考えは合っていますか?~~ ⇒ こちらについては, 質問に記載した`Symbol.iteratorプロパティ`についての記事にて, 以下の記述があったため, 解決致しました. > よく知られた Symbol.iterator シンボルはオブジェクトに対するデフォルトイテレーターを指定します。**for...of によって使われます。** 長くなってしまいましたが, ぜひ教えて頂きたいです. よろしくお願いします.
guest

0

単語の意味から考えるとわかりやすいと思います。
"iterate" は「繰り返す」という意味の単語です。
"iterator"は「繰り返す者(動作の主体)」( ~or とか ~er とかの接尾辞はそんな感じのニュアンスですよね?)
"iterable"は「繰り返し可能な対象」(~able ですからね)

つまり、iterable なオブジェクトは繰り返し可能で、
実際に繰り返すときには、 iterable なオブジェクトから iterator を取得し、その iterator を利用して繰り返しを行います。

で、具体的に iterable なオブジェクトから iterator を取り出す方法が、 itrable[Symbol.iterator]() というコードになるわけです。
逆に、この方法で iterator を取り出せるオブジェクトが iterable であるということもできるわけです。

Symbol.iteratorは何をしているわけでもなく、他のプロパティと区別するためのただのマーカーなんだと思います。

投稿2018/09/26 10:58

R.Mizukami

総合スコア1077

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

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

what_is_fff

2018/09/27 13:38

なるほど, それぞれ単語の意味として捉えると, まったく異なるものであることがわかりやすいですね. 直接イテレータを扱うことと, `Symbol.iteratorプロパティ`経由でイテレータを扱うこと, それぞれで`for-of構文`を使用できる, ということ以外に何か利点があるのか, という疑問は残りますが... . ご回答をして頂き, ありがとうございました.
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問