1.イテレータの概要
1.イテレータの概要
「コレクション」を表すJavaScriptの元のデータ構造は、主に配列(Array)とオブジェクト(Object)であり、ES6はMapとSetを追加します。Iteratorは、さまざまなデータ構造に統合されたアクセスメカニズムを提供するインターフェイスです。Iteratorインターフェースをデプロイすることにより、任意のデータ構造をトラバースできます。
2.イテレータの役割
イテレータには3つの機能があります。
- さまざまなデータ構造に統一されたシンプルなアクセスインターフェイスを提供します
- データ構造のメンバーは、特定の順序で並べ替えることができます
- ES6は... ofループ用の新しいトラバーサルコマンドを作成しました。Iteratorインターフェイスは主に... of消費用です。
3.反復プロセス
- 現在のデータ構造の開始位置を指すSymbol.iteratorを介してイテレータを作成します
- 次に、nextメソッドを使用して、次の位置を指すように繰り返します。nextメソッドは、現在の位置にあるオブジェクトを返します。オブジェクトには、valueとdoneの2つの属性が含まれます。Valueは現在の属性の値です。Doneは決定に使用されます。トラバーサルが終了したかどうか。
- 完了がtrueの場合、トラバーサルは終了します
4.Iteratorインターフェースを備えたネイティブデータ構造
- アレイ
- 地図
- セットする
- ストリング
- TypedArray
- 関数の引数オブジェクト
- NodeListオブジェクト
5.Symbol.iteratorプロパティ
Symbol.iteratorプロパティを使用してデータ構造がデプロイされている限り、イテレータインターフェイスがあると見なされます
2、イテレータの使用法
1.基本的な使用法
const items = ["zero", "one", "two"];
const it = items[Symbol.iterator]();
it.next();
>{
value: "zero", done: false}
it.next();
>{
value: "one", done: false}
it.next();
>{
value: "two", done: false}
it.next();
>{
value: undefined, done: true}
2.カスタムトラバーサーオブジェクトのreturn()、throw()
return()メソッドの使用例は、for ... ofループが早期に終了した場合(通常はエラーまたはbreakステートメントが原因で)、return()メソッドが呼び出されることです。トラバーサルを完了する前にオブジェクトがリソースをクリーンアップまたは解放する必要がある場合は、return()メソッドをデプロイできます。
function readLinesSync(file) {
return {
[Symbol.iterator]() {
return {
next() {
return {
done: false };
},
return() {
file.close();
return {
done: true };
}
};
},
};
}
次の2つの状況では、return()メソッドの実行がトリガーされます。
// 情况一
for (let line of readLinesSync(fileName)) {
console.log(line);
break;
}
// 情况二
for (let line of readLinesSync(fileName)) {
console.log(line);
throw new Error();
}
3、for ... ofループ
for ... ofループが使用できる範囲には、配列、SetおよびMap構造、いくつかの配列のようなオブジェクト(argumentsオブジェクト、DOM NodeListオブジェクトなど)、以下で説明するジェネレーターオブジェクト、および文字列が含まれます。
1.アレイ
JavaScriptの元のfor ... inループは、オブジェクトのキー名のみを取得でき、キー値を直接取得することはできません。ES6はfor ... ofループを提供し、トラバーサルがキー値を取得できるようにします。
var arr = ['a', 'b', 'c', 'd'];
for (let a in arr) {
console.log(a); // 0 1 2 3
}
for (let a of arr) {
console.log(a); // a b c d
}