javascript 中可通过 iterator 和 generator 实现类似 c# linq 的延迟查询,核心是每个操作符返回绑定当前迭代器的 generator 函数,保持惰性链式调用,仅在终止操作(如 toarray、first)或遍历时执行,支持短路优化与无限序列。

JavaScript 中可以通过 Iterator 和 Generator 实现类似 C# LINQ 的延迟查询(lazy evaluation),核心在于:每个操作符返回一个新的可迭代对象(即 Generator 函数),不立即执行,只在遍历时按需计算。
用 Generator 封装延迟操作链
关键思路是让每个查询方法(如 where、select、take)返回一个 Generator 函数,它接收上游的迭代器,并在其上叠加逻辑。整个链路保持惰性,直到调用 for...of 或展开运算符([...iter])才真正触发执行。
- 每个操作符不消耗原始数据,而是包装并转换迭代行为
- Generator 内部用
yield*委托上游迭代器,配合条件或映射逻辑实现过滤/投影 - 避免一次性收集全部结果,内存友好,支持无限序列(如自然数流)
实现基础 Queryable 类
定义一个 Queryable 类,构造时接收任意可迭代对象(Array、Set、自定义 iterator 等),并提供链式方法:
class Queryable {
constructor(iterable) {
this[Symbol.iterator] = () => iterable[Symbol.iterator]();
}
<p>where(predicate) {
return new Queryable(function* () {
for (const item of this) {
if (predicate(item)) yield item;
}
}.bind(this));
}</p><p>select(selector) {
return new Queryable(function* () {
for (const item of this) yield selector(item);
}.bind(this));
}</p><p>take(count) {
return new Queryable(function* () {
let taken = 0;
for (const item of this) {
if (taken >= count) break;
yield item;
taken++;
}
}.bind(this));
}</p><p>toArray() {
return Array.from(this);
}
}</p>
注意:每个方法返回新的 Queryable 实例,且内部 Generator 绑定当前实例的迭代器,确保链式调用正确委托。
支持组合与终止操作
延迟链需要两类操作:中间操作(返回新 Queryable)和 终止操作(触发执行并返回结果)。常见终止操作包括:
- toArray():收集全部结果为数组
- first():取首个匹配项,可带 predicate
- any():判断是否存在满足条件的元素
- count():统计数量(仍惰性,只遍历不存储)
例如 first 实现:
first(predicate = () => true) {
for (const item of this) {
if (predicate(item)) return item;
}
return undefined;
}
实际使用示例
模拟 LINQ 风格写法:
const numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]; <p>const result = new Queryable(numbers) .where(x => x % 2 === 0) // 偶数 .select(x => x * x) // 平方 .take(3); // 取前3个</p><p>console.log([...result]); // [4, 16, 36] console.log(result.toArray()); // [4, 16, 36] console.log(result.first(x => x > 20)); // 36</p>
整个过程没有中间数组生成,where 和 select 仅定义逻辑,take(3) 还会提前终止遍历 —— 典型的延迟+短路优化。
不复杂但容易忽略:Generator 必须正确绑定上下文(用 bind(this)),且终止操作要直接消费迭代器而非再次包装,否则会多一层惰性导致语义错误。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











