说一下自己对迭代器的粗浅理解

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")); // true

array,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) ? '是可迭代' : '不可迭代'));

这就是我对迭代器的理解