iterator



概要


ブックマークのような配列オブジェクトが現在どの位置を指しているかを解くには,ウィジェットが非常に重要な役割を果たす.

基本構文

const player = ['Kane', 'Salah', 'Martin', 'Messi', 'Alponso'];

const plyaerIter = player.values();

plyaerIter.next(); // {value: "Kane", done: false}
plyaerIter.next(); // {value: "Salah", done: false}
plyaerIter.next(); // {value: "Martin", done: false}
plyaerIter.next(); // {value: "Messi", done: false}
plyaerIter.next(); // {value: "Alponso", done: false}
plyaerIter.next(); // {value: undefined, done: true}
plyaerIter.next(); // {value: undefined, done: true}
配列でvalues()メソッドを使用してイテレーションを宣言できます.ウィジェットでnext()を呼び出すとvalueとdone propertyを含むオブジェクトが返され、valueは配列内の要素値を順次割り当て、アクセスする要素がなければundefinedとなります.doneは、すべての要素を巡回する前にfalseであり、すべての要素にアクセスした後、何度呼び出してもtrueである.
const player = ['Kane', 'Salah', 'Martin', 'Messi', 'Alponso'];

const plyaerIter1 = player.values();
const plyaerIter2 = player.values();

plyaerIter1.next(); // {value: "Kane", done:false}
plyaerIter2.next(); // {value: "Kane", done:false}
plyaerIter1.next(); // {value: "Salah", done:false}
参照の配列が同じでも、個別に宣言されたイテレーションはそれぞれ独立しています.クラスを参照して作成したインスタンスと同様に、独立したオブジェクトです.
const player = ['Kane', 'Salah', 'Martin', 'Messi', 'Alponso'];

for(let name of player){
  console.log(name);
} // Kane, Salah, Martin, Messi

const targetMan = 'Kane';

for(let char of targetMan){
  console.log(char);
} // K, a, n, e
配列内の重複文などの文字列...オブジェクトがイテレーションの場合、ofループを使用できます.

プロトコル


双方向ネットワーク通信の分野でいう通信規約のように、オブジェクト<>iterableオブジェクト間は、一連の約束によって簡単に切り替えることができ、イテレーションプロトコルはSymbolを表す.反復器を利用できます.
class Log{
  constructor(){
    this.messages = [];
  }
  
  add(message){
    this.messages.push({message, timestamp: Date.now()});
  }
  
  [Symbol.iterator](){
    return this.messages.values();
  }
}
ログクラスを使用してインスタンスを作成すると、ログレコードがメッセージに追加され、出力されます.x.メッセージでアクセスできますが、インスタンス内のPropertyを呼び出すのではなく、Symbolを配列として使用します.配列要素は反復器でクエリーできます.
例は以下のとおりです.
const log = new Log();
log.add('Kane');
log.add('Salah');
log.add('Bale');

for(let entry of log){
  console.log(`${entry.message} and ${entry.timestamp}`);
}

Kane and 1604318176428
Salah and 160431817642
Bale and 1604318176428