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オブジェクト
(1)for...of(2)分解賦課値(3)拡張演算子[...a](4)yield*の後ろは巡回可能な構造です.
Interatorオブジェクトのreturn()throw()
自分でインターフェースを書くなら、[Symbol.Iterator]メソッドのnext()メソッドが必要になりますが、return()とthrow()メソッドは不要です.
SetとMapデータ構造のエルゴードプロセス
生成したデータ構造を計算します.
entries()はエルゴードオブジェクトを返し、キーの配列を遍歴するために使用します.配列に対して、キーの名前は索引の値です.セットに対して、キーの名前とキーの値は同じです.Map構造のIteratorインターフェースは、デフォルトではentriesメソッドを呼び出します.
keys()は、すべてのキーの名前を巡回するためにエルゴードオブジェクトを返します.
values()はすべてのキーを巡るオブジェクトを返します.
Interatorのオブジェクトへの遍歴
オブジェクトはデフォルトではIteratorインターフェースがないので、for...ofサイクルは使えませんが、for...inループを使ってキー名を導出し、for...ofサイクルキー名を指定します.
(1)最も原始的なforサイクル(書き方が面倒くさい)(2)forEachサイクル(途中でサイクルから抜けられない、breakとreturnはだめ)(3)for…inサイクル(遍歴して文字列1、2、3;数字キーだけではなく、手動で追加された他のキー、さらに原型チェーン上のキー)(4)for…ofサイクル(文法が簡潔で、break;return;continue;配合使用)
参考文献阮一峰公式サイト(Iteratorとfor…ofサイクル)
Iteratorインターフェースとfor…ofサイクル
目次
インタフェースの一つであり、三つの役割:異なるデータ構造のための統一的なアクセスメカニズムを提供する.データ構造のメンバーをある順序で並べられるようにする.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サイクル)