JavaScript迭代器核心是next()方法,返回{value, done}对象;实现[Symbol.iterator]()的对象为可迭代对象,供for…of等消费;生成器函数可简化迭代器创建。

JavaScript迭代器的核心是next()方法,它每次调用返回一个形如{ value: ..., done: true|false }的对象。只要对象有这个next方法,它就是一个迭代器;而实现了[Symbol.iterator]()方法的对象,则是可迭代的(比如数组、字符串、Map等),能被for...of、展开运算符、解构等语法消费。
迭代器的工作机制
迭代器本质是一个状态机:内部维护当前遍历位置和是否结束的状态。next()被调用时,它推进状态、返回当前值,并标记是否已完成。
第一次调用next(),通常返回第一个元素,done: false 持续调用直到某次返回{ value: undefined, done: true },表示遍历结束 for...of会自动反复调用next(),直到done为true才停止 如果迭代器中途抛错,或next()返回格式错误(如缺value或done),会中断遍历
手动创建一个简单迭代器
只需写一个函数,返回带next()方法的对象:
function createRangeIterator(start, end) { let current = start; return { next() { if (current < end) { return { value: current++, done: false }; } else { return { value: undefined, done: true }; } } };}const it = createRangeIterator(1, 4);console.log(it.next()); // { value: 1, done: false }console.log(it.next()); // { value: 2, done: false }console.log(it.next()); // { value: 3, done: false }console.log(it.next()); // { value: undefined, done: true }
让对象支持for...of:实现[Symbol.iterator]
给任意对象添加[Symbol.iterator]方法,就能让它变成可迭代对象:
立即学习“Java免费学习笔记(深入)”;
const countdown = { from: 3, [Symbol.iterator]() { let current = this.from; return { next() { if (current > 0) { return { value: current--, done: false }; } else { return { value: undefined, done: true }; } } }; }};for (const num of countdown) { console.log(num); // 3, 2, 1}
注意:[Symbol.iterator]必须返回一个迭代器对象(即含next()的对象),不能直接返回值或普通对象。
用生成器函数简化自定义迭代器
生成器函数(function*)是创建迭代器最简洁的方式——函数体内的yield会自动暂停/恢复执行,并封装好next()逻辑:
const fibonacci = { *[Symbol.iterator]() { let a = 0, b = 1; while (true) { yield a; [a, b] = [b, a + b]; } }};// 取前5个斐波那契数const fibIter = fibonacci[Symbol.iterator]();console.log(fibIter.next().value); // 0console.log(fibIter.next().value); // 1console.log(fibIter.next().value); // 1console.log(fibIter.next().value); // 2console.log(fibIter.next().value); // 3// 或直接用 for...of(但注意无限生成器需手动限制)for (const n of fibonacci) { if (n > 10) break; console.log(n); // 0, 1, 1, 2, 3, 5, 8}
生成器函数天然返回迭代器,适合处理序列、异步流、树遍历等场景,代码更清晰、状态管理更安全。
基本上就这些。迭代器不复杂但容易忽略细节——关键是理解next()的契约和[Symbol.iterator]的桥梁作用。用生成器写,基本不用手造状态机。
以上就是JavaScript迭代器如何工作_如何自定义迭代器?的详细内容,更多请关注创想鸟其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1541850.html
微信扫一扫
支付宝扫一扫