Symbol.iterator 是内置符号,用于定义对象的默认迭代行为。通过实现 [Symbol.iterator]() 方法并返回符合迭代器协议的对象(具有 next() 方法,返回 {value, done}),可使对象支持 for…of、扩展运算符等语法。常用生成器函数简化实现,如 [Symbol.iterator]() { yield* iterable; }。该方法让类数组或自定义结构能被原生迭代操作使用。

JavaScript中的Symbol.iterator属性用于定义对象的默认迭代行为,允许你自定义一个对象在for...of循环、展开运算符(...)等场景下的遍历方式。只要一个对象实现了Symbol.iterator方法,并返回一个符合迭代器协议的对象,它就可以被迭代。
Symbol.iterator 是什么?
Symbol.iterator 是一个内置的 Symbol 值,指向一个方法。当一个对象的这个属性被调用时,必须返回一个迭代器对象,该对象遵循迭代器协议:有一个 next() 方法,每次调用返回形如 { value: any, done: boolean } 的对象。
如何实现自定义迭代行为?
通过为对象添加 [Symbol.iterator]() 方法,你可以控制它的遍历逻辑。
例如,让一个类数组对象可迭代:
const myCollection = { items: ['a', 'b', 'c'], [Symbol.iterator]() { let index = 0; return { next: () => { if (index < this.items.length) { return { value: this.items[index++], done: false }; } else { return { done: true }; } } }; }};// 现在可以使用 for...offor (const item of myCollection) { console.log(item); // 输出: a, b, c}// 也可以使用扩展运算符console.log([...myCollection]); // ['a', 'b', 'c']
使用生成器函数简化实现
更常见的做法是使用生成器函数(function*),它会自动返回一个符合迭代器协议的对象。
立即学习“Java免费学习笔记(深入)”;
示例:用生成器实现迭代:
const counter = { from: 1, to: 5, *[Symbol.iterator]() { for (let i = this.from; i <= this.to; i++) { yield i; } }};for (const num of counter) { console.log(num); // 输出: 1, 2, 3, 4, 5}
这种方式更简洁,避免手动管理状态和 next() 返回值。
哪些语法依赖 Symbol.iterator?
以下操作会自动查找对象的 Symbol.iterator 属性:
for...of 循环 扩展运算符:... 数组解构:const [a, b] = iterable; Array.from() new Set(iterable)、new Map(iterable)
如果你希望自定义对象能在这类上下文中使用,就必须实现 Symbol.iterator。
基本上就这些。只要提供一个返回迭代器的 Symbol.iterator 方法,就能让任意对象支持原生的迭代语法。
以上就是JavaScript中的Symbol.iterator属性如何用于自定义迭代行为?的详细内容,更多请关注创想鸟其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1526776.html
微信扫一扫
支付宝扫一扫