可迭代对象 Iterable object
一. 概念
1. 内建可迭代对象 : 即自带有迭代接口 [Symbol.iterator] 的 Array , Arguments , Set, Map , String, TypeArray, Nodelist 等,内建支持 for ... of 迭代形式的对象
for...of... 详情见 : for...of - JavaScript | MDN (mozilla.org)
2. 迭代器 : 对于普通对象,如果需要用到 for ... of ... 进行迭代,需要为其手动添加方法 [Symbol.iterator] , 方法内部必须返回一个 迭代器(iterator)即:一个有 next
()方法的对象。
3. next返回值 : next() 方法的返回结果必须是 { value : any , done : boolean } 的形式 , 当next()返回值为done = true时即停止迭代 ,否则一直迭代下去
二. 添加迭代器接口 :
1. 对象自身没有 [Symbol.iterator] 接口,需要手动添加
//1. 创建一个对象 let num= { start: 1, end: 5 }; //2. 为自建对象添加方法 num[Symbol.iterator] = function() { //3. 该方法返回一个包含next()方法的对象,即迭代器对象 return { current: this.start, last: this.end, //4. next()的返回值必须符合形式 next() { //4.1 循环时迭代输出当前值++ ,直到current>end迭代结束 if (this.current <= this.last) { return { done: false, value: this.current++ }; } else { return { done: true }; } } }; }; //调用for...of...时会进入[Symbol.iterator]方法,循环迭代current++ for (let number of num) { console.log(number); // 1, 2, 3, 4, 5 }
2. 迭代器对象 和 迭代对象 是区分开来的,也可以利用迭代对象自身作为迭代器对象
let num= { start: 1, end: 5, [Symbol.iterator]() { this.current = this.start; // 返回对象自身---包含next()方法的迭代对象作为迭代器对象 return this; }, // 当前迭代对象添加一个next()方法,且符合返回值形式 next() { if (this.current <= this.end) { return { done: false, value: this.current++ }; } else { return { done: true }; } } }; for (let number of num) { console.log(number); // 1, 2, 3, 4, 5 }
但是此时迭代对象利用自身作为迭代器对象,因为他们两个会共享迭代状态,因此迭代过程中不能不能同时存在for...of...的两个迭代。
3. 显示调用迭代器 : 对于自带[Symbol.iterator] 接口的对象,例如字符串,可以手动拆分其迭代过程,使迭代过程中可以进行更多操作
let str = "Hello World"; // 1. 手动获取调用其迭代接口,相当于对其进行一次 for...of...操作 let iterator = str[Symbol.iterator](); while (true) { // 2. 手动调用迭代接口的next()方法进行输出 let result = iterator.next(); // 3. 迭代完毕则停止循环 if (result.done) break; // 循环过程中手动控制迭代,有利于进行一些其它操作 console.log(result.value); }
本文作者:jojolai
本文链接:https://www.cnblogs.com/jojolai/p/16381572.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步