迭代器艰亮, 生成器离钝, yield 都是ES6 中的新語法
迭代器
迭代器由三個方法組成:
- hasNext() 是否還有下一個元素
- next() 迭代到下一個元素
- reset() 重置,一般用來拋出異常
下面是一個簡單的迭代器的例子:
function Range(min,max){//[min,max)
return {
cur:min,
hasNext:function(){
return this.cur<max;
},
next:function(){
return this.cur++;
},
reset:function(){
throw new Error('unsupportted operation');
}
}
}
for(var iter = Range(1,10);iter.hasNext();){
i = iter.next();
console.log(i);
}
可以看到月腋, 每次在使用Range 函數(shù)的時候蟀架, 都要調用 .hasNext() 方法來判斷一下是否還有下一個元素,之后再執(zhí)行 .next() 函數(shù)罗售。
生成器和yield
普通的函數(shù)以 function 來定義辜窑, 而生成器函數(shù)則是由 function* 來定義≌辏可以說 生成器是一種更好的實現(xiàn)迭代器的方式穆碎。
yield 的作用: yield可以看出是“暫停”了函數(shù)的執(zhí)行职恳, 然后在調用函數(shù)的.next() 方法之后所禀, 函數(shù)開始執(zhí)行直到下一個 yield的表達式方面。
上邊的生成器代碼可以改變?yōu)椋?/p>
function* Range(start, end) {
for(var i = start; i<end;i ++) {
yield i; (2)
}
}
var range = Range(1,10); // (1)
while(true) {
var ran = range.next(); // (3)
if(ran.done) break;
console.log(ran);
}
輸出的結果 :
{ value: 1, done: false}
value: 表示當前的值,即yield 之后的返回色徘,
done: 表示當前的循環(huán)是否已經(jīng)完成恭金,true 為完成。
函數(shù)的運行方式為
(1), (3), (2), (3), (2), (3), (2)......
正好可以驗證我們之前所說的 “暫凸硬撸”
注意
如果我們調用range函數(shù)横腿, 第一次的返回值是一個空的 generator Object
var kk = Range(1,10);
console.log(kk);
輸出為:
{}