您现在的位置是:亿华云 > 系统运维
盘点JavaScript中的Iterable object(可迭代对象)
亿华云2025-10-08 20:58:30【系统运维】7人已围观
简介大家好,我是进阶学习者。一、概念可迭代(Iterable) 对象是数组的泛化。这个概念是说任何对象都可以被定制为可在 for..of 循环中使用的对象。数组是可迭代的。但不仅仅是数组,很多其他内建对象
大家好,盘点我是可迭进阶学习者。
一、代对概念
可迭代(Iterable) 对象是盘点数组的泛化。这个概念是可迭说任何对象都可以被定制为可在 for..of 循环中使用的对象。
数组是代对可迭代的。但不仅仅是盘点数组,很多其他内建对象也都是可迭可迭代的。
二、代对通过创建一个对象,盘点就可以轻松地掌握可迭代的可迭概念。
1.字符串是代对可迭代的
数组和字符串是使用最广泛的内建可迭代对象。
对于一个字符串,盘点for..of 遍历它的可迭每个字符:
for (let char of "test") { // 触发 4 次,每个字符一次 alert( char ); // t,代对 then e, then s, then t }
对于代理对(surrogate pairs),它也能正常工作!
(译注:这里的代理对也就指的是服务器租用 UTF-16 的扩展字符)
let str = 𝒳😂; for (let char of str) { alert( char ); // 𝒳,然后是 😂 }2. 显式调用迭代器(如何显式地使用迭代器?)。
将会采用与 for..of 完全相同的方式遍历字符串,但使用的是直接调用。这段代码创建了一个字符串迭代器,并“手动”从中获取值。
let str = "Hello"; // 和 for..of 做相同的事// for (let char of str) alert(char); let iterator = str[Symbol.iterator](); while (true) { let result = iterator.next(); if (result.done) break; alert(result.value); // 一个接一个地输出字符 }注:
很少需要这样做,但是比 for..of 给了更多的控制权。例如,可以拆分迭代过程:迭代一部分,然后停止,做一些其他处理,然后再恢复迭代。
3. Array.from
有一个全局方法 Array.from 可以接受一个可迭代或类数组的值,并从中获取一个“真正的”数组。然后就可以对其调用数组方法了。
例:
let arrayLike = { 0: "Hello", 1: "World", length: 2 }; let arr = Array.from(arrayLike); // (*) alert(arr.pop()); // World(pop 方法有效)// World(pop 方法有效)运行结果:
在 (*) 行的 Array.from 方法接受对象,检查它是一个可迭代对象或类数组对象,然后创建一个新数组,并将该对象的所有元素复制到这个新数组。企商汇
现在用 Array.from 将一个字符串转换为单个字符的数组:
let str = 𝒳😂;// 将 str 拆分为字符数组 let chars = Array.from(str);alert(chars[0]); // 𝒳 alert(chars[1]); // 😂 alert(chars.length); // 2运行结果:
注:
与 str.split 方法不同,它依赖于字符串的可迭代特性。
因此,就像 for..of 一样,可以正确地处理代理对(surrogate pair)。(译注:代理对也就是 UTF-16 扩展字符。)
另外一种表达方式
技术上来说,它和下文做了同样的事:
let str = 𝒳😂; let chars = []; // Array.from 内部执行相同的循环 for (let char of str) { chars.push(char); } alert(chars);运行结果:
但 Array.from 精简很多。
甚至可以基于 Array.from 创建代理感知(surrogate-aware)的slice 方法(译注:也就是能够处理 UTF-16 扩展字符的 slice 方法):
function slice(str, start, end) { return Array.from(str).slice(start, end).join(); } let str = 𝒳😂𩷶; alert(slice(str, 1, 3)); // 😂𩷶// 原生方法不支持识别代理对(译注:UTF-16 扩展字符) alert(str.slice(1, 3)); // 乱码(两个不同 UTF-16 扩展字符碎片拼接的结果)三、总结
本文基于JavaScript基础。介绍了Iterable object(可迭代对象),应用 for..of 的对象被称为 可迭代的。通过创建一个对象,详细的讲解了字符串是可迭代的。显式调用迭代器,以及在实际中 Array.from的应用。
欢迎大家积极尝试,有时候看到别人实现起来很简单,源码下载但是到自己动手实现的时候,总会有各种各样的问题,切勿眼高手低,勤动手,才可以理解的更加深刻。
代码很简单,希望对你学习有帮助。
很赞哦!(793)
相关文章
- 只要我们做的是从目前的市场情况选择域名,从简单易记,从个性特征上,我们就可以找到一个好域名进行注册。域名注册进行域名记录和解析以及绑定网站后,客户可以通过URL登录您的网站。
- 更好的Python对象序列化方式
- Java高进进阶之FastThreadLocal源码详解(修复ThreadLocal的缺陷)
- 成为全球首个鸿蒙游戏引擎后, Cocos这次憋了个3D领域的新大招
- 域后缀首选.com,.net,然后是.cn。后缀选择不当,导致流量损失。域名是企业与互联网网址之间的链接,关键是企业在网络上存在的标志。因此,选择好域名是开展网上工作的首要重要条件。
- 前端进阶之JS运行原理和机制详解
- Java高进进阶之FastThreadLocal源码详解(修复ThreadLocal的缺陷)
- Java EE几十种技术,“活着的”还剩几何(服务/安全/Java SE篇)
- 2、根据用户基础选择访问提供程序。由于互联问题的存在,接入商的选择也非常重要,如果用户群主要在联通,尽量选择联通接入较好的接入商,如果用户群主要在电信,那么选择电信接入较好的接入商。如果用户组位于国家/地区,则选择更好的访问提供程序进行交互。
- Dubbo服务发现、引用过程
站长推荐
尽量不要在域名中出现特殊字符,这样的域名很容易导致访问者输入错误,同时给人留下不专业的印象,降低网站的可信度,并流失大量潜在客户。
快速使用 Docker 上手 Sentry-CLI - 玩转 Source Maps 使用 (Create-React-App)
因为使用PeerDependencies而引发的bug
萌新指南 | SOA vs. 微服务:What’s the Difference?
域后缀首选.com,.net,然后是.cn。后缀选择不当,导致流量损失。域名是企业与互联网网址之间的链接,关键是企业在网络上存在的标志。因此,选择好域名是开展网上工作的首要重要条件。
软件工程师永不过时的五项技能
前后端数据交互—Ajax 、Fetch 和 Axios 优缺点及比较
SpringBoot 使用转换器将前端参数转换为枚举