いろいろなオブジェクトに@@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