Iterator(迭代器)
迭代器是实现了 Iterator 协议的对象,必须包含一个 next() 方法,该方法返回 { value, done } 形式的对象。value 是当前元素,done 表示是否遍历完毕。在本工具中,迭代器是整个管道的数据源——所有 Map、Filter、Take 操作都作用于迭代器产出的元素序列。理解迭代器协议是使用 Iterator Helpers 的基础。
Iterator Helpers
TC39 Stage 3 提案,为 Iterator.prototype 添加了一系列实用方法。本工具演示的核心方法包括 map()、filter() 和 take(),此外还包括 drop()、flatMap()、reduce()、toArray()、forEach()、some()、every() 和 find()。这些方法使迭代器可以直接进行链式操作,无需先转为数组。本工具的可视化管道正是对这三个核心方法链式调用的直观呈现。
惰性求值(Lazy Evaluation)
惰性求值是 Iterator Helpers 的核心特性,意味着管道中的每个操作不会立即处理所有元素,而是在终止操作(如 toArray())被调用时才逐个处理。本工具通过每步输出的可视化来帮助理解这一概念——虽然界面上显示了完整的结果数组,但在实际执行中,take(3) 只会触发足够生成 3 个结果的迭代次数,而非处理全部数据。这是 Iterator Helpers 与数组方法的关键区别。
急切求值(Eager Evaluation)
急切求值是传统数组方法(如 Array.prototype.map、Array.prototype.filter)的工作方式。每次调用这些方法时,都会立即遍历整个数组并创建一个新数组。例如 [1,2,3].map(x=>x*2) 会一次性处理所有 3 个元素并返回新数组 [2,4,6]。在本工具中,与 Iterator Helpers 的惰性求值对比,急切求值会产生中间数组,对于大数据集或无限序列可能导致内存问题。理解这两种求值策略的区别是学习 Iterator Helpers 的重要一步。
map() 转换
map() 是 Iterator Helpers 的转换方法,对迭代器中的每个元素应用一个函数,返回一个新的迭代器。例如 iterator.map(x => x * 2) 会将每个元素乘以 2。在本工具的可视化管道中,Map 步骤是第一步操作,用户可以在转换表达式输入框中自定义转换逻辑。Map 不改变元素数量,只改变每个元素的值。本工具中每步输出展示的转换结果数组,正是 Map 操作的具体效果。
filter() 过滤
filter() 是 Iterator Helpers 的过滤方法,根据条件函数筛选迭代器中的元素,返回只包含满足条件元素的新迭代器。例如 iterator.filter(x => x > 5) 只保留大于 5 的元素。在本工具中,Filter 是管道的第二步,过滤条件使用 Map 步骤的输出作为输入。修改过滤条件后,输出数组的长度可能发生变化,直观展示了过滤效果。filter 同样是惰性的——在实际执行中,它会逐个检查元素,直到满足终止条件。
take(n) 截取
take(n) 返回一个新的迭代器,只生成原迭代器的前 n 个元素。如果 n 超过元素总数,则生成所有元素。在本工具中,Take 是管道的第三步也是终止操作。通过调整取出数量,用户可以观察到最终结果的长度变化。take 是惰性的——它不会先处理所有元素再截取,而是在遍历时只取前 n 个,这在处理大型数据集时可以显著减少计算量。与之对应的 drop(n) 则是跳过前 n 个元素。
drop(n) 跳过
drop(n) 返回一个新的迭代器,跳过原迭代器的前 n 个元素,返回剩余元素。与 take(n) 互补——take 取前 n 个,drop 跳过前 n 个。在本工具中虽然未直接演示 drop,但它是 Iterator Helpers 的重要组成部分。例如处理分页数据时,可以用 drop((page-1) * pageSize).take(pageSize) 实现跳过前面的页面数据并取当前页的数据。drop 同样是惰性的,不会实际处理被跳过的元素。
UD5工具箱