ES 6精通のIteratorインターフェースとfor…ofサイクルパーソナルノート

3658 ワード

2019-11-20
Iteratorインターフェースとfor…ofサイクル
目次
  • Interator概念
  • Interatorエルゴードプロセス
  • デフォルトのインターフェース
  • Iteratorインターフェースを呼び出す場合
  • Interatorオブジェクトのreturn()throw()
  • SetとMapデータ構造のエルゴードプロセス
  • は、生成されたデータ構造
  • を計算する.
  • Interatorのオブジェクト遍歴
  • Interatorと他のエルゴード文法の比較
  • Interator概念
    インタフェースの一つであり、三つの役割:異なるデータ構造のための統一的なアクセスメカニズムを提供する.データ構造のメンバーをある順序で並べられるようにする.s 6を通して提供されたfor…of…
    Interator(エルゴード)プロセスを巡回しました.
    スタート地点を指すポインタを作成します.next()を呼び出して、ポインタをデータ構造の最初のメンバに向けます.next()を継続的に呼び出し、データ構造の終了位置を指示します.巡回するたびに、value(現在値)とdone(完了するかどうか)を持つオブジェクトを返します.
    デフォルトのインターフェース
    データ構造にInteratorインターフェースが配置されている限り、あるいはSymbol.iterator属性があるということで、for...ofによって巡回可能な便利なデータ構造を備えています.配列、文字列、Set、Map、argment、NodeListオブジェクト
    let arr = ['a', 'b', 'c'];let iter = arr[Symbol.iterator]();
    
    iter.next() // { value: 'a', done: false }
    iter.next() // { value: 'b', done: false }
    iter.next() // { value: 'c', done: false }
    iter.next() // { value: undefined, done: true }
    
    対象体はiteratorインターフェースがあるたびに、彼はどれを先に遍歴してどれを遍歴するか分からないので、エルゴードは線形処理です.
    let iterable = {
    a: 'a',
    b: 'b',
    c: 'c',
    length: 3,
    [Symbol.iterator]: Array.prototype[Symbol.iterator]};for (let item of iterable) {
    console.log(item); // undefined, undefined, undefined
    }
    
    Iteratorインターフェースを呼び出す場合
    (1)for...of(2)分解賦課値(3)拡張演算子[...a](4)yield*の後ろは巡回可能な構造です.
    let generator = function* () {
    yield 1;
    yield* [2,3,4];
    yield 5;};
    
    var iterator = generator();
    
    iterator.next() // { value: 1, done: false }
    iterator.next() // { value: 2, done: false }
    iterator.next() // { value: 3, done: false }
    iterator.next() // { value: 4, done: false }
    iterator.next() // { value: 5, done: false }
    iterator.next() // { value: undefined, done: true
    
    (5)その他の場合Aray.form()Map()Set()WeakMap()WeakSet()Promise.all()Promise.race()
    Interatorオブジェクトのreturn()throw()
    自分でインターフェースを書くなら、[Symbol.Iterator]メソッドのnext()メソッドが必要になりますが、return()とthrow()メソッドは不要です.
    //    
    for (let line of readLinesSync(fileName)) {
    console.log(line);
    break;}
    //    
    for (let line of readLinesSync(fileName)) {
    console.log(line);
    throw new Error();}
    
    (2)throw()throw法は主にGenerator関数に合わせて使用され、一般的なエルゴードオブジェクトはこの方法が使えない.「Generator関数」を参照してください.
    SetとMapデータ構造のエルゴードプロセス
    var engines = new Set(["Gecko", "Trident", "Webkit", "Webkit"]);
    for (var e of engines) {console.log(e);}
    // Gecko
    // Trident
    // Webkit
    var es6 = new Map();
    es6.set("edition", 6);
    es6.set("committee", "TC39");
    es6.set("standard", "ECMA-262");for (var [name, value] of es6) {
    console.log(name + ": " + value);}
    // edition: 6
    // committee: TC39
    // standard: ECMA-262
    
    遍歴の順序は、それぞれのメンバーが追加された順序で出力された2.Setの持続時間によって返される値であり、Mapが遍歴して帰ってくるのは配列である.
    生成したデータ構造を計算します.
    entries()はエルゴードオブジェクトを返し、キーの配列を遍歴するために使用します.配列に対して、キーの名前は索引の値です.セットに対して、キーの名前とキーの値は同じです.Map構造のIteratorインターフェースは、デフォルトではentriesメソッドを呼び出します.
    keys()は、すべてのキーの名前を巡回するためにエルゴードオブジェクトを返します.
    values()はすべてのキーを巡るオブジェクトを返します.
    Interatorのオブジェクトへの遍歴
    オブジェクトはデフォルトではIteratorインターフェースがないので、for...ofサイクルは使えませんが、for...inループを使ってキー名を導出し、for...ofサイクルキー名を指定します.
    for (var key of Object.keys(someObject)) {
    console.log(key + ': ' + someObject[key]);}
    
    Interatorは他の遍歴文法と比較します.
    (1)最も原始的なforサイクル(書き方が面倒くさい)(2)forEachサイクル(途中でサイクルから抜けられない、breakとreturnはだめ)(3)for…inサイクル(遍歴して文字列1、2、3;数字キーだけではなく、手動で追加された他のキー、さらに原型チェーン上のキー)(4)for…ofサイクル(文法が簡潔で、break;return;continue;配合使用)
    参考文献阮一峰公式サイト(Iteratorとfor…ofサイクル)