美文网首页让前端飞
给js对象添加迭代器,让对象也可以使用 for...of

给js对象添加迭代器,让对象也可以使用 for...of

作者: docman | 来源:发表于2020-03-26 21:18 被阅读0次

几种for对比

忘了来源哪里,望指出,侵删

迭代器

  • 拥有迭代器的对象我们叫做 iterable ,而迭代器叫做 iterator ,这是两个不同的概念
  • 所有拥有 [Symbol.iterator]() 的对象被称为可迭代的
  • 原理:
    for-of 循环首先调用集合的 [Symbol.iterator]() 方法,紧接着返回一个新的迭代器对象。迭代器对象可以是任意具有 next() 方法的对象; for-of 循环将重复调用这个方法,每次循环调用一次

原理及实现

  1. 给对象添加一个名称为 Symbol.iterator 的属性方法。Symbol.iterator 是一个内置符号,代表一个迭代器方法。
  2. Symbol.iterator 这个方法必须返回一个迭代器对象,包含一个 next 方法

    next() 方法每次执行都返回一个结果对象,这个对象有两个属性:

    • value ,表示将要返回的值;
    • done ,是一个布尔值,表示是否进行下次迭代
  3. 迭代器还会保存一个 内部指针 ,用来指向当前集合中值的位置,每调用一次 next() 方法,都会返回下一个可用的结果对象。
var obj = { a: 1, b: 2 };

Object.prototype[Symbol.iterator] = function () {
    const keys = Object.keys(this);
    let index = 0;

    return {
        next: () => {
            return {
                value: this[keys[index++]], // 每次迭代的结果
                done: index > keys.length // 迭代结束标识 false停止迭代,true继续迭代
            };
        }
    }
}

for (let n of obj) {
    console.log(n);
    /**
     * 1
     * 2
     */
}

参考:

相关文章

  • 给js对象添加迭代器,让对象也可以使用 for...of

    几种for对比 迭代器 拥有迭代器的对象我们叫做 iterable ,而迭代器叫做 iterator ,这是两个...

  • 利用Symbol.iterator设置迭代器

    Symbol.iterator为每一个对象定义了默认的迭代器。该迭代器可以被 [for...of] 循环使用。 S...

  • 迭代器、生成器

    迭代器对象 实现了迭代器协议的对象叫做迭代器对象,迭代器对象可以使用 next 和 __next__ 方法进行迭...

  • 带你了解可迭代对象、迭代器、生成器

    可迭代的对象 使用 iter 内置函数可以获取迭代器的对象。如果对象实现了能返回迭代器的 iter 方法,那么对象...

  • 可迭代的对象与迭代器详解

    可迭代的对象 使用iter内置函数可以获取迭代器的对象。如果对象实现了能返回迭代器的iter方法,那么对象就是可迭...

  • iterator与generator

    可迭代对象: 能使用for x in xxx 迭代器: 针对的是对象(class); 把一个迭代对象变成迭代器,只...

  • Python高级第七天

    一、可迭代对象 可迭代的对象(Iterable)是指使用iter()内置函数可以获取迭代器(Iterator)的对...

  • Python多任务_总结

    迭代器、可迭代对象: 我们把可以通过for...in...这类语句迭代读取一条数据供我们使用的对象称之为可迭代对象...

  • 【JS算法】LRU 缓存

    先复习下迭代器和可迭代对象 迭代器是确使用户可在容器对象(如链表、数组)上遍访的对象,使用该接口无需关心对象的内部...

  • react 对象动态添加属性 setState

    // js 对象动态添加 js对象动态添加 //总结,给对象动态添加变量属性的方法如下: //obj[变量]=变...

网友评论

    本文标题:给js对象添加迭代器,让对象也可以使用 for...of

    本文链接:https://www.haomeiwen.com/subject/fkuhuhtx.html