理解 JavaScript 中的迭代协议和迭代器协议

JavaScript 中的迭代器、生成器与可迭代对象:深入理解遍历机制 迭代器是一个对象,它提供了一种标准的方式来遍历集合中的元素。迭代器对象必须实现一个next()value:当前遍历的值。done:一个布尔值,表示遍历是否结束。} else {// 输出: 1, 2, 3, 4, 5myIterable是一个可迭代对象,因为它实现了方法。方法返回一个迭代器对象,该对象实现了next()方法。next()方法每次返回一个值,直到遍历结束。生成器是一种特殊的函数,通过function*关键字定义。 阅读详情

在 JavaScript 中,迭代协议和迭代器协议是两个重要的概念,它们定义了对象如何被迭代以及如何生成一系列值。本文将详细介绍这两个协议,并通过代码示例帮助理解它们的实际应用。


什么是迭代协议?

迭代协议允许 JavaScript 对象定义或定制它们的迭代行为。例如,在 for...of 循环中,哪些值可以被遍历到。以下是迭代协议的两个核心部分:

1. 可迭代协议

要成为可迭代对象,一个对象必须实现 [Symbol.iterator]() 方法。该方法是一个无参函数,返回一个符合迭代器协议的对象。

  • [Symbol.iterator] 的作用
    当一个对象需要被迭代时(例如在 for...of 中),会调用其 [Symbol.iterator]() 方法,返回一个迭代器对象。迭代器对象负责生成迭代的值。

  • 实现方式
    [Symbol.iterator]() 方法可以是普通函数,也可以是生成器函数。生成器函数可以使用 yield 提供每个条目。

2. 迭代器协议

迭代器协议定义了如何生成一系列值。当所有值迭代完毕后,会返回一个默认的结束标志。

  • next() 方法
    一个对象要成为迭代器,必须实现 next() 方法。该方法返回一个对象,包含以下两个属性:
    • done:布尔值,表示是否迭代完成。
    • value:当前迭代的值。

内置可迭代对象

以下是一些内置的可迭代对象:

  • String
  • Array
  • TypedArray
  • Map
  • Set
  • Intl.Segments
  • arguments 对象
  • 一些 DOM 集合类型(如 NodeList)

这些对象的原型都实现了 [Symbol.iterator]() 方法。


接受可迭代对象的内置 API

以下内置 API 可以接受可迭代对象:

  • Map
  • WeakMap
  • Set
  • WeakSet
  • Promise.all
  • Promise.allSettled
  • Promise.any
  • Promise.race
  • Array.from
  • Object.groupBy
  • Map.groupBy

示例代码

以下是一些代码示例,帮助理解迭代协议和迭代器协议的实际应用。

1. 自定义可迭代对象
const genObj = {
        [Symbol.iterator]() {
                let i = 0;
                return {
                        next() {
                                i++;
                                if (i === 3) {
                                        return { value: undefined, done: true };
                                }
                                return { value: i, done: false };
                        },
                        return() {
                                console.log('closing');
                                return { done: true };
                        }
                };
        }
};

const [a, b, c] = genObj; // 解构可迭代对象
console.log(a, b, c); // 1 2 undefined

for (const value of genObj) {
        break; // 迭代一次,执行 return 方法
}
2. 使用生成器函数创建迭代器
const myIterator = {
        *[Symbol.iterator]() {
                yield 1;
                yield 2;
                yield 3;
        }
};

console.log([...myIterator]); // [1, 2, 3]
3. 使用类封装可迭代对象
class SimpleClass {
        #data;
        constructor(data) {
                this.#data = data;
        }
        *[Symbol.iterator]() {
                for (const value of this.#data) {
                        yield value;
                }
        }
}

const simple = new SimpleClass([1, 2, 3]);
for (const value of simple) {
        console.log(value); // 1, 2, 3
}
4. 重写字符串的迭代器方法
const str = 'hello';
str[Symbol.iterator] = function () {
        return {
                next() {
                        if (this._first) {
                                this._first = false;
                                return { value: 'bye', done: false };
                        } else {
                                return { done: true };
                        }
                },
                _first: true
        };
};

for (const key of str) {
        console.log(key); // bye
}
5. 简单迭代器实现
function createIterator(items) {
        let i = 0;
        return {
                next() {
                        const done = i >= items.length;
                        const value = !done ? items[i++] : undefined;
                        return { done, value };
                }
        };
}

const iterator = createIterator([1, 2, 3]);
console.log(iterator.next()); // { done: false, value: 1 }
console.log(iterator.next()); // { done: false, value: 2 }
console.log(iterator.next()); // { done: false, value: 3 }

总结

  • 可迭代协议定义了对象如何被迭代,要求实现 [Symbol.iterator]() 方法。
  • 迭代器协议定义了如何生成一系列值,要求实现 next() 方法。
  • JavaScript 提供了许多内置的可迭代对象和支持迭代的 API。
  • 通过生成器函数或自定义类,可以轻松实现自定义的可迭代对象。

理解迭代协议和迭代器协议,不仅有助于掌握 JavaScript 的核心机制,还能帮助我们更高效地处理数据结构和流式数据。

Iterator,迭代器协议,可迭代协议 迭代器协议是什么 迭代器协议定义了产生一系列值(无论是有限个还是无限个)的标准方式。当值为有限个时,所有的值都被迭代完毕后,则会返回一个默认返回值。 只要满足迭代器协议议的对象都可以成为迭代器,迭代器协议,是指对象要定义名为next的无参方法,并且next会返回一个对象,对象包含done(boolean)和value属性,比如: var iterator = { count : 0, next : function(){ return { done 阅读详情

相关推荐

JavaScript内核与高级编程之:`JavaScript`的`Iterable`协议:`for…of`循环的底层实现。

这是一个特殊的Symbol值,用来表示一个对象是否实现了Iterable协议。记住,这是一个属性名,它的值必须是一个函数!Iterable协议,说白了,就是JavaScript里定义的一种规范,一种标准。我是今晚的主讲人,咱们今晚就来聊聊JavaScript里一个看似简单,实则蕴含深刻哲理的东东——Generator函数是ES6引入的一个强大的特性,它可以用来创建迭代器。可以把Iterable看作是一个“可迭代的容器”,而Iterator则是这个容器里的“搬运工”。那么,这个“插座规格”到底是什么呢?

weixin_41455464的博客 213

boost log 能不能循环覆盖_理解JavaScript中的循环缺陷和迭代协议

如果您已经用JavaScript或任何语言编程了一段时间,for-循环对你来说不应该陌生.您没有注意到许多编程语言,包括JavaScript,已经从使用for-循环使用迭代器-返回给定集合的下一项的对象。此外,迭代器使我们的生活在使用集合时变得更容易和更有效率。这就是为什么理解JavaScript迭代器对每个开发人员都有好处,并将在本文中探讨这个主题。好吧,那我们开始吧。背景在开始之前,最好先阅读...

weixin_36202273的博客 116

【Out-of-Distribution Detection】Evidential Deep Learning in NeurIPS 2018 个人理解

核心思想是将分类器的概率输出视为一个狄利克雷分布(Dirichlet Distribution)并替换,之后引入两个损失分别负责保证预测结果准确性和提升被错误分类的样本的不确定性。

研究兴趣:开放集识别、开放世界识别、新类发现、增量学习、少样本学习 2436

javascript -- 迭代器 es6新增特性

迭代器 1、什么是迭代?   迭代的英文为 iteration, 意思为“重复” 或 “再来”。 在软件开发领域中, “迭代” 的意思是按照顺序反复多次执行一段程序, 通常会有明确的终止条件。 计数循环就是一种最简单的迭代 for (let i = 0; i <= 10; i++) { console.log(i) }   循环是迭代机制的基础,这是因为它可以指定迭代的次数,以及每次迭代要执行什么操作。每次循环都会在下一次迭代开始之前完成,而每次迭代的顺序都是事先定义好的。 迭代会在一个有序的集合

一个憨憨的前端之路 203

WinServer 2012 R2 搭建 AD 单域多站点 及 DNS各站点的子网掩码排序调整

WinServer 2012 R2 搭建 AD 单域多站点 及 DNS各站点的子网掩码排序调整

一直被模仿,从未被超越 5533

VS Code + ESP-IDF:离线环境配置与示例工程编译全指南

本文详细介绍了在VS Code中离线配置ESP-IDF开发环境的完整流程。针对国内开发者常遇到的网络问题,指南提供了从Python环境准备、获取离线安装包、运行安装器到VS Code插件配置与示例工程编译的全套解决方案,确保环境搭建稳定、可控且高效。

weixin_28842367的博客 403

JavaScript Lazy evaluation:可迭代对象与迭代器

作者:MelkorNemesis 译者:前端小智 来源:medium 点赞再看,养成习惯 本文 GitHub https://github.com/qq449245884/xiaozhi 上已经收录,更多往期高赞文章的分类,也整理了很多我的文档,和教程资料。欢迎Star和完善,大家面试可以参照考点复习,希望我们一起有点东西。 Lazy evaluation Lazy evaluation常被译为“延迟计算”或“惰性计算”,指的是仅仅在真正需要执行的时候才计算表达式的值。 与惰性求值相反的是及早求值(.

粉丝们务必加入微信粉丝群 577

浅谈ES6中的迭代器和生成器

文章目录迭代器背景知识什么是迭代器可迭代协议For of 循环生成器什么是生成器如何创建一个生成器如何书写一个生成器函数生成器函数内部是如何实现的 迭代器 背景知识 什么是迭代器 可迭代协议 For of 循环 生成器 什么是生成器 如何创建一个生成器 如何书写一个生成器函数 生成器函数内部是如何实现的 ...

Choo01的博客 336

71、机器人与机器人控制器技术解析

本文深入解析了机器人控制器的通信接口、传感器数据采集与处理以及抓手技术三大核心技术。详细介绍了数字I/O、串行接口、总线系统和以太网等通信方式,探讨了各类传感器在焊接、装配、质量检测等场景中的应用,并阐述了手眼校准与路径校正的关键方法。同时,文章还分析了不同类型抓手的特点及选型设计原则,展示了机器人在现代工业自动化中的高效性与灵活性。通过实际编程示例与流程图,全面呈现了机器人系统的集成与控制逻辑。

gin88的博客 275

Qt6.10 | Qt Bluetooth 蓝牙

本文介绍了QtBluetooth模块的功能和使用方法,包括蓝牙API概述、构建配置(CMake/qmake)、权限管理、平台支持(Linux/macOS特殊处理)、日志设置及许可信息。重点说明Linux平台的后端选择机制,以及macOS上的依赖限制。最后提及蓝牙聊天示例,展示RFCOMM协议通信的实现。全文提供了蓝牙开发的技术要点和注意事项。

Qt历险记,专注Qt技术,三年医疗设备研发经验,1年机器视觉研发经验,半年柔性传感研发经验。 400

迭代器模式

const arr=[1,2,3,4]; const node_list=document.getElementsByName('p'); const $a=$('p'); /*三种数据结构,需要三种迭代写法*/ arr.forEach(function(item){ console.log(item); }) for(let i=0;i<node_list.length;i...

aliven1的博客 205

MIKE水动力笔记17_MIKE文件转shp、统计每个单元格的面积

MIKE的工具箱中自带一个转shp的工具,然后可以拖进ArcGIS中很方便的统计每个单元格的面积和每个网格点的水深。

晏长街的博客 4152

JS高级 之 使用 Iterator - Generator

JS高级 之 使用 Iterator - Generator

玄鱼殇 711

ZooKeeper 实战:使用 Docker Compose 部署 ZooKeeper 集群

ZooKeeper是一个开源的分布式协调服务,用于管理大型分布式系统中的数据。它由Apache软件基金会提供,最初是Hadoop的一个子项目,但后来发展成为一个独立的顶级项目。ZooKeeper提供的一致性协调服务对于构建分布式应用和服务非常重要,特别是在需要精确的领导选举、配置管理、命名服务、分布式同步和提供分布式锁等功能时。

SmartSi 1541

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

JavaScript|第16章:可迭代对象与 Map/Set

摘要 本文深入探讨JavaScript中的可迭代对象与Map/Set集合类型。主要内容包括: 迭代协议:可迭代对象需实现Symbol.iterator方法,返回符合迭代器协议(next()方法)的对象。 内建可迭代对象:Array、String、Map、Set等原生支持for...of遍历。 自定义迭代器:通过实现Symbol.iterator和迭代器协议,可创建自定义可迭代对象(如Range类)。 Map与Set:介绍了Map的键值存储特性(支持对象作为键)和Set的元素唯一性特点。 WeakMap/We

xhmico的博客 189

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

js 深入理解迭代器

迭代器的底层原理,自定义迭代器

weiweiliude2的专栏 1634

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

理解js中的迭代器

JavaScript迭代器(Iterator)是ES6引入的统一数据遍历机制,核心是定义了一个包含next()方法的对象。每次调用next()返回{value, done},实现有状态的遍历。可迭代对象(如数组、Map)通过Symbol.iterator方法提供迭代器。迭代器支持for...of、解构赋值、展开运算符等语法,解决了不同数据结构遍历方式碎片化的问题。手动实现迭代器需要定义状态维护逻辑,而Generator函数可简化这一过程。迭代器机制为JavaScript提供了标准化的数据访问接口。

m0_46335150的博客 1039

JS中的迭代器和生成器

不算原创,更像是翻译,按照自己的理解组织了一下,内容主要来自Mozilla Iterators and Generators 以及页面里的相关扩展链接。

一壁蔷薇枝 4513

JS的迭代器和可迭代对象详解

迭代器(iterator),是使用户在容器对象(container,例如链表或数组)上可以遍历访问的对象,使用该接口无需关心容器对象的内部实现细节。从迭代器的定义我们可以看出来,迭代器是帮助我们对某个数据结构进行遍历的对象。在JavaScript中,迭代器也是一个具体的对象,这个对象需要符合迭代器协议(iterator protocol):next方法要求:next方法是一个无参数或者有一个参数的函数,返回结果应当拥有以下两个属性的对象:1.done(boolean) : done返回一个布尔值: 可能是

m0_71485750的博客 5550

Js 中迭代器、生成器详解!

什么是 迭代器? 广义上来讲 迭代器 (iterator) 有时又称光标 (cursor) 是程序设计软件的一种 设计模式……

潜隐-前端 1284

写点东西《理解 JavaScript 中的异步迭代器》

但是,使用事件并不是编写可维护代码的最佳方式之一,因为事件是完全异步的,并且它们可能会破坏代码的流程,因为它们会无序触发,并且您只能通过侦听器分配一个操作。想象一下,我们有另一个总是返回 Promise 的接口,该 Promise 会针对我们所讨论的文件行进行解析。但是,由于异步迭代器在 Node 8.x 或 9.x 中不受支持(我知道非常老了),因此为了在这些版本中使用异步迭代器,我们可以简单地从对象中提取。更加简洁,也更加干净,因为它表现得像一个常规循环,但除此之外,它还比理解起来简单得多,它通过。

Mr.Bone 1177

JS迭代器与生成器

1.生成器是ES6中新增的一种函数控制、使用的方案,它可以让我们更加灵活的控制函数什么时候继续执行、暂停执行等。平时我们会编写很多的函数,这些函数终止的条件通常是返回值或者发生了异常。2.生成器是一个函数,单数和普通函数有一些区别:生成器函数需要在function后面加一个符号生成器函数可以通过yield关键字来控制函数的执行流程生成器函数的返回值是一个Generator生成器,且生成器是一种特殊的迭代器3.代码举例console.log('函数开始执行');yield 123。

前端小白 1472

【深扒】 JavaScript 中的迭代器

读懂 JavaScript 中的迭代器 大家好,我是小丞同学,本文将会带你深入理解 ES6 中的迭代器。 发现问题 在 ES6 中提出迭代器模式之前,传统迭代存在着怎样的问题?为什么要新增迭代器呢? 我们先来看几个例子 let arr = ['小', '丞', '呀'] 这是一个简单的数组,如果要获取它的每一项数据,我们可以采用 for 循环,当然也可以采用 forEach 循环,很酷 关于 forEach 循环在之前的文章有解释,原文连接 当纯这样还没什么问题 我们在看下面代码

小丞同学 1816

js迭代器与生成器

迭代器 背景 1.什么是迭代器 从一个数据集合中按照一定的顺序,不断取出数据的过程 2.迭代和循环有什么区别? 迭代强调的是依次去数据,并不保证取多少,也不保证所有的数据都要取完 遍历:把整个数据依次的全部取出 3.迭代器 对迭代过程的封装,在不同语言中有不同的表现形式,通常是一个对象。 4.迭代模式 一种设计模式,用于统一迭代过程,并且规范了迭代器规格。 –迭代器具有得到下一个数据的能力 –迭代器具有判断是否还有后续数据的能力 JS中迭代器 JS规定 如果一个对象具有 next(),并且该方法能够返回一个

weixin_44649210的博客 1303

ES6中的生成器和迭代器以及可迭代协议理解

一、迭代器和可迭代协议 1.迭代:每一次对过程的重复称为一次“迭代”,而每一次迭代得到的结果会作为下一次迭代的初始值。 2.js中的迭代器:如果一个对象具有next方法,且该方法会返回一个具有以下两个属性的对象,那么称这个对象为一个迭代器 value:传给下一次迭代的值 done:boolean类型,判断当前是否迭代完成,如果为true表示迭代完成 一个简单的迭代器: const iterator = { total: 3, now: 1, next()

qq_43660897的博客 277
上一篇: 深入理解 JavaScript 生成器(Generator)(后含async/await实现原理)
下一篇: 深入理解 JSONP:跨域的经典解决方案
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值