ES6之遍历器 iterator && generator
程序员文章站
2022-04-15 22:13:48
...
工作机制
- 创建一个指针对象,指向数组的初始位置
- 调用next方法,对数组逐个进行遍历
- 遍历结果的返回值是一个对象,这个对象中包含两个属性,value和done
- 当遍历没有结束,对象返回的结果为:{value: 当前遍历对象的下标, done: false}
- 遍历结束以后,对象返回的结果为:{value: undefined, done: true}
- 结束后,不对此时的value值进行处理
function makeIterator(arr) {
let nextIndex = 0;
return {
next:function () {
return (nextIndex < arr.length
? {value:arr[nextIndex++],done:false}
:{value:undefined,done:true})
}
}
}
let arr = [1,2,3,5];
let iteratorObj = makeIterator(arr);
console.log(iteratorObj.next()); //{value: 1, done: false}
console.log(iteratorObj.next()); //{value: 2, done: false}
console.log(iteratorObj.next()); //{value: 3, done: false}
console.log(iteratorObj.next()); //{value: 5, done: false}
console.log(iteratorObj.next()); //{value: undefined, done: true},以后都是这个结果
console.log(iteratorObj.next()); //{value: undefined, done: true}
iterator模拟遍历对象
function iteratorMaker() {
// this的指向就是调用的对象
console.log(this)
// 保存this
let that = this;
let index = 0;
// 如果这个iterator遍历器遍历的对象是数组 //由于数组中存在Symbol,所以这段代码可以去掉
if(that instanceof Array){
// 返回一个对象
return {
// 调用next方法
next: function () {
// 返回这个对象相应的value,done属性的值
return index < that.length ? {value:that[index++],done:false}:{value:that[index++],done:true};
}
}
}
// 如果是对象
else {
/* 调用Object.keys()方法,
说明:Object.keys()方法遍历对象的属性名,返回的是一个数组
例如:
let obj = {id:1,age:2};
let key = Object.keys(obj);
console.log(key); // ["id", "age"]
*
* */
*
let keys = Object.keys(that);
return {
next:function () {
return index < keys.length ? {value:that[keys[index++]],done:false}:{value:that[keys[index++]],done:true};
}
}
}
}
// 验证数组
// 将Array的prototype中的Symbol.iterator方法指向改变,指向iteratorMaker
Array.prototype[Symbol.iterator]=iteratorMaker;
let arr=[1,2,3,55];
for(var i of arr){
console.log(i);
}
console.log(arr);
// 验证对象
// 给Object的prototype添加Symbol.iterator方法为 iteratorMaker
Object.prototype[Symbol.iterator] = iteratorMaker;
let obj = {id:1,age:2};
for (var item of obj){
console.log(item)
}
console.log(obj);`
generator遍历器
工作机制
- 调用next函数,遇到yield时暂停,接着调用next,遇到yield时暂停
- 终点 {value: undefined, done: true}
function* generatorTest() {
console.log('函数开始执行')
yield '1';
console.log('函数再次执行')
yield '2';
}
// 生成遍历器对象
let G = generatorTest();
// 执行函数,遇到yield后暂停
console.log(G); //{value: "1", done: false}
// 再次执行函数,遇到yield后暂停
let result = G.next(); //{value: "2", done: false}
console.log(result);
result = G.next(); //{value: undefined, done: true}
console.log(result);
result = G.next(); //{value: undefined, done: true}
console.log(result);
result = G.next();
console.log(result);