如何把一个对象变成可迭代对象?

简介: 如何把一个对象变成可迭代对象?

可迭代对象(Iterable object)是数组的泛化,这个概念是在说任何对象都可以被定制为可在 for…of 循环中使用的对象。

也就是说,可以应用 for…of 的对象被称为 可迭代对象。

迭代器

在 JavaScript 中,迭代器是一个对象,它定义一个序列,并在终止时可能返回一个返回值。


更具体地说,迭代器是通过使用 next() 方法实现Iterator protocol的任何一个对象,该方法返回具有两个属性的对象:


value,这是序列中的 next 值

done,如果已经迭代到序列中的最后一个值,则它为 true

如果 value 和 done 一起存在,则它是迭代器的返回值。

一旦创建,迭代器对象可以通过重复调用 next() 显式地迭代。


迭代一个迭代器被称为消耗了这个迭代器,因为它通常只能执行一次。


在产生终止值之后,对 next() 的额外调用应该继续返回 {done: true}。


Javascript 中最常见的迭代器是 Array 迭代器,它只是按顺序返回关联数组中的每个值。


虽然很容易想象所有迭代器都可以表示为数组,但事实并非如此。数组必须完整分配,但迭代器仅在必要时使用,因此可以表示无限大小的序列,例如 0 和无穷大之间的整数范围。


这是一个可以做到这一点的例子。它允许创建一个简单的范围迭代器,它定义了从开始(包括)到结束(独占)间隔步长的整数序列。它的最终返回值是它创建的序列的大小,由变量 iterationCount 跟踪。

let index = 0
const bears = ['ice', 'panda', 'grizzly']
let iterator = {
  next() {
    if (index < bears.length) {
      return { done: false, value: bears[index++] }
    }
    return { done: true, value: undefined }
  }
}
console.log(iterator.next()) //{ done: false, value: 'ice' }
console.log(iterator.next()) //{ done: false, value: 'panda' }
console.log(iterator.next()) //{ done: false, value: 'grizzly' }
console.log(iterator.next()) //{ done: true, value: undefined }

实现可迭代对象

如果一个对象拥有 [Symbol.iterator] 方法,并且该方法返回一个迭代器对象,这样的对象即可称为可迭代对象

let info = {
  bears: ['ice', 'panda', 'grizzly'],
  [Symbol.iterator]: function() {
    let index = 0
    let _iterator = {
       //这里一定要箭头函数,或者手动保存上层作用域的this
       next: () => {
        if (index < this.bears.length) {
          return { done: false, value: this.bears[index++] }
        }
        return { done: true, value: undefined }
      }
    }
    return _iterator
  }
}
let iter = info[Symbol.iterator]()
console.log(iter.next())
console.log(iter.next())
console.log(iter.next())
console.log(iter.next())
//符合可迭代对象协议 就可以利用 for of 遍历
for (let bear of info) {
  console.log(bear)
}
//ice panda grizzly
相关文章
|
7月前
|
存储 数据处理
什么是迭代,什么是可迭代对象
什么是迭代,什么是可迭代对象
132 1
|
7月前
对象的优化
对象的优化
|
1月前
|
JSON 程序员 C#
使用 C# 比较两个对象是否相等的7个方法总结
比较对象是编程中的一项基本技能,在实际业务中经常碰到,比如在ERP系统中,企业的信息非常重要,每一次更新,都需要比较记录更新前后企业的信息,直接比较通常只能告诉我们它们是否指向同一个内存地址,那我们应该怎么办呢?分享 7 个方法给你!
|
2月前
|
存储 Java
JVM知识体系学习四:排序规范(happens-before原则)、对象创建过程、对象的内存中存储布局、对象的大小、对象头内容、对象如何定位、对象如何分配
这篇文章详细地介绍了Java对象的创建过程、内存布局、对象头的MarkWord、对象的定位方式以及对象的分配策略,并深入探讨了happens-before原则以确保多线程环境下的正确同步。
59 0
JVM知识体系学习四:排序规范(happens-before原则)、对象创建过程、对象的内存中存储布局、对象的大小、对象头内容、对象如何定位、对象如何分配
|
3月前
|
索引 Python
如何优雅地遍历可迭代对象?
如何优雅地遍历可迭代对象?
28 0
|
3月前
|
索引 Python
解密可迭代对象的排序问题
解密可迭代对象的排序问题
28 0
|
6月前
new 一个对象的过程中发生了什么
new 一个对象的过程中发生了什么
|
6月前
详尽分享遍历对象的几种方法
详尽分享遍历对象的几种方法
106 0
|
7月前
|
JavaScript 前端开发 索引
往数组添加对象的方法
往数组添加对象的方法
34 0
|
7月前
|
JSON JavaScript 前端开发
揭秘类数组对象:形似数组,超越数组!(下)
揭秘类数组对象:形似数组,超越数组!(下)