说一下自己对迭代器的粗浅理解
JS中满足了迭代协议(Iterator protocol )的对象就是可迭代对象
就是一个对象中拥有一个[Symbol.iterator]的方法;此方法返回一个next方法;next则返回一个对象{value:xxx,done:true/false}
value
迭代器返回的具体值,如果done是true,代表迭代完毕,此时value应该是undefined
done
为false时,说明迭代未结束,后面还有;
为true时,说明迭代完毕,继续调用next方法,依然返回如此
经过测试,目前知道string,array,map,set都是可迭代的,如何判断呢?
可迭代对象都可以使用 for ... of 遍历,或者拥有[Symbol.iterator]方法
比如string,判断是否拥有[Symbol.iterator]属性且是个函数,可以写如下代码测试
function isIterator(obj){
return typeof obj[Symbol.iterator] === 'function';
}
console.log(isIterator([])); // true
console.log(isIterator({})); // false
console.log(isIterator("hello")); // truearray,map,set也可以用此方式验证
// 看看map set是不是实现了迭代协议
let ma = new Map();
ma.set('name','张三疯');
console.log('map迭代??',ma[Symbol.iterator]().next())
for(let m of ma){
console.log('map迭代?',ma.get('name'))
}
console.log("看来map是可迭代对象")
let ss = new Set();
ss.add("三点一四");
console.log("set迭代?",ss[Symbol.iterator]().next());
console.log("看来set是可迭代对象")object就不是一个可迭代对象
let obj = {name:'张三',age:12};
// 这里会报错
// for(let b of obj){
// console.log(b);
// }
//也可以使用上方的判断方法来进行判断
console.log('object' + (isIterator(obj) ? '是可迭代' : '不可迭代'));
//object不可迭代如何将object也变成可迭代呢?只能手写了
其实只需要满足上述的条件即可
let obj2 = {
name:'张三',
age:12,
//有这个属性,且此属性是个方法
[Symbol.iterator]:function(){
const _this = this;
//获取对象的所有key
let keys = Object.keys(_this)
let index = 0;
//返回next方法
return {
next(){
//判断是否遍历完成
let res;
if(index <= (keys.length-1)){
res = {
value:_this[keys[index]],
done: false
};
index++;
}else{
res = {
value:undefined,
done: true
};
}
//返回值是一个对象{value:xxx,done:true/false}
return res;
}
};
}
};
//这样就可以迭代了
let diedai3 = obj2[Symbol.iterator]();
console.log(diedai3.next());
console.log(diedai3.next());
console.log(diedai3.next());
//或者这样
for(let c of obj2){
console.log(c);
}
//或者这样
console.log('obj2' + (isIterator(obj2) ? '是可迭代' : '不可迭代'));这就是我对迭代器的理解
















