迭代器 iterator
实现迭代器函数
js
/*
* 这是一个手写的迭代器(Iterator)
* 满足迭代器协议的对象。
* 迭代器协议: 对象的 next 方法是一个无参函数,它返回一个对象,该对象拥有 done 和 value 两个属性:
*/
var it = makeIterator(["a", "b"]);
it.next(); // { value: "a", done: false }
it.next(); // { value: "b", done: false }
it.next(); // { value: undefined, done: true }
function makeIterator(array) {
var nextIndex = 0;
return {
next: function () {
return nextIndex < array.length
? { value: array[nextIndex++], done: false }
: { value: undefined, done: true };
},
};
}
可迭代的迭代器
js
/**
* 使迭代器可迭代
* makeIterator 函数生成的迭代器并没有实现可迭代协议
* 所以不能在 for...of 等语法中使用。
* 可以为该对象实现可迭代协议,在 [Symbol.iterator] 函数中返回该迭代器自身
* 从新名了下函数名称 createIterator
*/
function createIterator(array) {
var nextIndex = 0;
return {
next: function () {
return nextIndex < array.length
? { value: array[nextIndex++], done: false }
: { value: undefined, done: true };
},
[Symbol.iterator]: function () {
console.log("返回的迭代器:", this);
return this; // 注意这里是对象调用模式,this 指向的就是上层的对象,迭代器
},
};
}
var iterator = createIterator([1, 2, 3]);
console.log(...iterator);