javascript中iterator使自定义集合支持扩展运算符,关键在于部署[symbol.iterator]方法并返回含next()的迭代器对象,next()需返回{value, done}格式结果。

JavaScript 中 Iterator 能让自定义集合被扩展运算符(...)识别并展开,关键在于为该集合对象部署 [Symbol.iterator] 方法,返回一个符合迭代器协议的对象。
自定义集合必须实现 [Symbol.iterator] 方法
扩展运算符只作用于可迭代对象(Iterable),而判断依据就是对象是否有 [Symbol.iterator] 属性,且它返回一个迭代器(Iterator)。这个迭代器需有 next() 方法,每次调用返回 { value, done } 形式的对象。
- 方法名必须严格写成
[Symbol.iterator](方括号表示计算属性名) -
next()应按顺序提供值,done: true表示结束 - 不必手动调用
next()—— 扩展运算符会自动遍历直到done为true
用类封装自定义集合并返回迭代器
推荐用 class 实现,把数据和迭代逻辑封装在一起。例如实现一个只读的数字区间集合:
class Range {
constructor(start, end) {
this.start = start;
this.end = end;
}
[Symbol.iterator]() {
let current = this.start;
return {
next() {
if (current
<p>这样就能直接展开:<code>[...new Range(1, 3)]</code> → <code>[1, 2, 3]</code>。</p><div class="aritcle_card flexRow artxards">
<div class="artcardd flexRow">
<a class="aritcle_card_img" rel="nofollow" href="/xiazai/skill6235" title="Java Maven Code Review"><img
src="https://img.php.cn/upload/skill/000/000/081/179084711841712.jpg" alt="Java Maven Code Review" onerror="this.onerror='';this.src='/static/lhimages/moren/morentu.png'" ></a>
<div class="aritcle_card_info flexColumn">
<a rel="nofollow" href="/xiazai/skill6235" title="Java Maven Code Review" class="overflowclass">Java Maven Code Review</a>
<p class="overflowclass">审查Java Maven项目(ZIP压缩包或GitLab仓库URL),检查代码规范、命名、模块边界、可维护性问题以及重复代码。</p>
</div>
<a rel="nofollow" href="/xiazai/skill6235" title="Java Maven Code Review" class="aritcle_card_btn flexRow flexcenter"><b></b><span>下载</span>
</a>
</div>
</div>
<h3>复用生成器函数简化迭代器编写</h3>
<p>手写 <code>next()</code> 容易出错,更简洁的方式是用 <code>function*</code> 生成器函数 —— 它天然返回迭代器对象:</p>
<pre class="brush:php;toolbar:false;">class Range {
constructor(start, end) {
this.start = start;
this.end = end;
}
*[Symbol.iterator]() {
for (let i = this.start; i
<p>生成器写法更直观、自动管理状态,也支持 <code>yield*</code> 委托其他可迭代对象,比如把数组或 Set 的内容一并 yield 出来。</p>
<h3>注意:扩展运算符不修改原集合,也不要求集合是数组</h3>
<p>只要满足可迭代协议,任何对象(如 Map、Set、字符串、自定义类)都能被展开。展开结果总是新数组(除非用于函数调用或解构):</p>
-
console.log(...new Range(0, 2));→ 输出0 1 2 -
const arr = [...new Range(5, 7)];→[5, 6, 7] - Map 和 Set 默认已实现
[Symbol.iterator],所以[...myMap]得到键值对数组,[...mySet]得到元素数组
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










