ES 6--エルゴードIteratorとfor…of


基本概念
配列へのアクセスには、for(var i=0;i , Object for...inを して、すべてのキーのペアを することができます.ES 6では、MapとSetのデータ も される.では、 なるデータ にアクセスできるようにするための インターフェース がありますか?
えはIteratorで、エルゴーバーです.これは、 なデータ のための なアクセスメカニズムを することができます. のデータ は、Iteratorインターフェースを すれば、for...ofコマンドを してエルゴード を することができます.データ の から、 がfor...ofを してあるデータ を したい 、このサイクルは にこのデータ のIteratorインターフェースを して び します. つけたら、このデータは できると います.
これでいいです.ES 6は、デフォルトのIteratorインターフェースがデータ のSymbol.iterator に されています.つまり、 つのデータ はSymbol.iterator を っている り、「エルゴーシュ」と えられます.for of....
に えば、for ofを いたいなら、 でSymbol.iteratorを します.(もちろん、 、クラスのオブジェクト、Set、Mapなどのデータ があります. らはもともとIteratorインターフェースを っています.そうすると、 たちは for ofエルゴードを うことができますが、できないものについては、やはりマニュアルで します.)
な を にエルゴードを します.
const obj = {
  [Symbol.iterator] : function () {
    return {
      next: function () {
        return {
          value: 1,
          done: true
        };
      }
    };
  }
};
この の で、 のobjはSymbol.iterator を っているので、 できるとされています. の は、
var iterator = obj[Symbol.iterator]();
iterator.next(); //{value:1,done:true}
//for offor of,          done true   ,       。
この をもう たら、 にまとめられます.Iteratorの :
1)        ,             。    ,        ,        。

(2next  ,                 。
 So,                 next  !

(3next  ,               。

(4next  ,              。
もう つの な :
この にはES 6のクラス を って に けたパターンを しています. はとても です.このコードの で はただ するだけで、constructorは に します.new RangeIteratorの に します.
class RangeIterator {
  constructor(start, stop) {
    this.value = start;
    this.stop = stop;
  }

  [Symbol.iterator]() { return this; }

  next() {
    var value = this.value;
    if (value < this.stop) {
      this.value++;
      return {done: false, value: value};
    }
    return {done: true, value: undefined};
  }
}

function range(start, stop) {
  return new RangeIterator(start, stop);//        
}

for (var value of range(0, 3)) {
  console.log(value);
}
このコードを してください.RangeIteratorはエルゴード タイプで、new RangeIteratorを する で、このエルゴードの startと stopを できます.このクラスは[Symbol.iterator]インターフェース、つまりRangeIteratorのオブジェクト を しています.このオブジェクトのnextメソッドは、 に されたstartからstopまでの を します.
tip:どのようにデータ のコードを しても、[Symbol.iterator]インターフェースから ってくるオブジェクトはnextメソッドが で、for ofの な が されます.もちろん、[Symbol.iterator]インターフェースは、このデータ のプロトタイプチェーン に してもよい.
また、クラスの オブジェクト(jsを して したDOMリスト)に して、Iteratorインターフェースを して、 に で けやすい があります.Symbol.iterator は のIteratorインターフェースを します.
NodeList.prototype[Symbol.iterator] = Array.prototype[Symbol.iterator];
//   
NodeList.prototype[Symbol.iterator] = [][Symbol.iterator];

for of にも、デフォルトでIteratorインターフェースを び す があります.
1) (ES 6: とSet を してください.)
2) (...)
//   
var str = 'hello';
[...str] //  ['h','e','l','l','o']

//   
let arr = ['b', 'c'];
['a', ...arr, 'd']
// ['a', 'b', 'c', 'd']
するのは しくないです.エルゴードを して (…)を み わせると、 の がIteratorインターフェースのデータ を に えることができます.
3)ield*
4)for…of
5)Aray.from()
6)Map()、Set()、WeakMap()、WeakSet()
7)Promise.all()
8)Promise.race()
のIteratorインターフェース
は のIteratorインターフェースを っています.
var someString = "hi";
typeof someString[Symbol.iterator]
// "function"

var iterator = someString[Symbol.iterator]();// Symbol.iterator              

iterator.next()  // { value: "h", done: false }
iterator.next()  // { value: "i", done: false }
iterator.next()  // { value: undefined, done: true }
もちろん、 でSymbol.iteratorを して、エルゴードを します.
var str = new String("hi");

[...str] // ["h", "i"]

str[Symbol.iterator] = function() {
  return {
    next: function() {
      if (this._first) {
        this._first = false;
        return { value: "bye", done: false };
      } else {
        return { done: true };
      }
    },
    _first: true
  };
};

[...str] // ["bye"]
str // "hi"
エルゴードを すると、 …またはfor of で にアクセスした が なりますが、 は わりません.
IteratorインターフェースとGenerator
のいくつかの では、Generator を しましたが、それは マシンのように、yield を って し、next で を して します. :http://blog.csdn.net/u014328357/article/details/71212203
Generator を うと、Symbol.iterator が に に できます.
var myIterable = {};
myIterable[Symbol.iterator] = function* () {
  yield 1;
  yield 2;
  yield 3;
};
[...myIterable] // [1, 2, 3]