ES 6--エルゴードIteratorとfor…of
9998 ワード
基本概念
配列へのアクセスには、
配列へのアクセスには、
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 of , for of, done true , 。
この をもう たら、 にまとめられます.Iteratorの :(1) , 。 , , 。
(2) next , 。
So, next !
(3) next , 。
(4) next , 。
もう つの な :
この には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]