JS.next

JavaScriptの最新実装情報を追うブログ

いろいろなオブジェクトに@@iteratorメソッドが実装された

概要

イテレータが期待される場面で呼ばれるビルトイン"iterator"シンボルメソッドが、様々なオブジェクトへ実装された。

実装されたオブジェクト

<Arguments>[@@iterator]   [3.29.17]

引数をイテレートするイテレータを返す。

function fun() {
  for (let arg of arguments) console.log(arg)
}

fun(1, 2, 3)

/*log
  1
  2
  3
*/


String.prototype[@@iterator]   [3.28.3]

一文字ずつイテレートするイテレータを返す。ただしサロゲートペアが考慮される。
通常UTF-16では1文字2バイトで表されるが、それに入りきらない文字は4バイトで表される。
これをプログラムから見ると2文字に見えてしまうが、それを1文字として扱ってくれる。

let str = '𠮟る'

str.length  // 3

str[0]  // (文字にならない)
str[1]  // (文字にならない)
str[2]  // "る"

for (let c of str) console.log(c)

/*log
  "𠮟"
  "る"
*/

String.prototype.normalizeと組み合わせることでより効力を発揮する。


Array.prototype[@@iterator]   [3.28.3]

要素をイテレートするイテレータを返す。Array.prototype.valuesと同じ。

Array.prototype[Symbol.iterator] === Array.prototype.values  // true

let ary = [1, 2, 3]

for (let v of ary) console.log(v)

/*log
  1
  2
  3
*/


%TypedArray%.prototype[@@iterator]   [3.28.3]

Array.prototype[@@iterator]の型付配列版


Map.prototype[@@iterator]   [3.27.18.1]

Map.prototype.entriesと同じ。


Set.prototype[@@iterator]   [3.27.18.1]

Set.prototype.valuesと同じ。


その他

様々なイテレータ自体にも【自分自身を返す】@@iteratorメソッドが実装されている。


実装されるバージョン

V8 3.27.18.1 3.28.3 3.29.17