模拟Iterator机制(数组)
function makeIteractor(array) {
var nextIndex = 0;
return {
next: function () {
if (nextIndex < array.length) {
return { value: array[nextIndex++], done: false }
}
return { value: undefined, done: true }
}
}
}
let arr = [10,10,30,50];
let iterator = makeIteractor(arr);
let obj = iterator.next();
console.log(obj);
let {value,done} = iterator.next();
console.log(value,done);
模拟Iterator机制(对象)
let obj = {
"name": "张三",
"age": 18,
"addr": "北京"
}
obj[Symbol.iterator] = function () {
let keys = Object.keys(this);
let index = 0;
return {
next: ()=> {
if (index < keys.length) {
let key = keys[index++];
return { value: this[key], done: false };
} else {
return { value: undefined, done: true };
}
}
}
}
let iterator = obj[Symbol.iterator]();
console.log(iterator);
let obj1 = iterator.next();
console.log(obj1);
for(let item of obj){
console.log(item);
}
Generator
- Generator是一个状态机器,内部封存了多个状态,直接调用Generator函数并不会执行,而是返回结果 Iterator
- Generator函数经常来搭配yield表达式使用,完成程序的分步执行
function* show(){
yield console.log(1111);
yield console.log(2222);
yield console.log(3333);
}
let i = show();
i.next();
i.next();
i.next();
- yield表达式是没有返回值的,若需要获取yield表达式后面的结果,则需要通过next方法来传递数据才可以
function * show() {
let num = yield Math.pow(2, 2);
console.log(num);
}
let i = show();
i.next();
i.next();