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

JavaScript中的Symbol.iterator属性用于定义对象的默认迭代行为,允许你自定义一个对象在for...of循环、展开运算符(...)等场景下的遍历方式。只要一个对象实现了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...of
for (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 属性:
for...of 循环...
const [a, b] = iterable;
Array.from()new Set(iterable)、new Map(iterable)
如果你希望自定义对象能在这类上下文中使用,就必须实现 Symbol.iterator。
Symbol.iterator 方法,就能让任意对象支持原生的迭代语法。以上就是JavaScript中的Symbol.iterator属性如何用于自定义迭代行为?的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号