惰性求值是一种延迟计算策略,JavaScript虽为严格求值语言,但可通过生成器实现惰性求值,利用yield暂停执行,按需生成值,适合处理无限序列与性能优化。
惰性求值是一种延迟计算的策略,只有在真正需要结果时才执行计算。JavaScript本身是严格求值(eager evaluation)的语言,但通过一些技巧可以实现惰性求值,尤其在函数式编程中非常有用,比如处理无限序列、提高性能或组合复杂操作。
惰性求值意味着表达式不会立即求值,而是等到其结果被使用时才计算。与之相对的是严格求值,即表达式一旦定义就立刻执行。
例如,在严格求值中:
const result = [1, 2,3].map(x => x * 2).filter(x => x > 3); // 立即执行 map 和 filter
而在惰性求值中,这些操作可以推迟到真正需要数据时才执行,甚至只计算所需的部分。
JavaScript 的 Generator 函数天然支持惰性求值。它通过 yield 暂停执行,每次调用 next() 才继续计算下一个值。
function* range(start = 0, step = 1) {
let current = start;
while (true) {
yield current;
current += step;
}
}
function* map(iterable, fn) {
for (const value of iterable) {
yield fn(value);
}
}
function* filter(iterable, predicate) {
for (const value of iterable) {
if (predicate(value)) {
yield value;
}
}
}
使用示例:
const numbers = range(0, 1); const doubled = map(numbers, x => x * 2); const evens = filter(doubled, x => x % 4 === 0);// 只有在取值时才计算 console.log(evens.next().value); // 0 console.log(evens.next().value); // 4 console.log(evens.next().value); // 8
这种链式操作不会预先计算所有值,而是按需生成,非常适合处理大量或无限数据。
我们可以封装一个更接近函数式风格的惰性结构:
class Lazy {
constructor(iterator) {
this.iterator = iterator;
}
map(fn) {
const iter = map(this.iterator, fn);
return new Lazy(iter);
}
filter(predicate) {
const iter = filter(this.iterator, predicate);
return new Lazy(iter);
}
take(n) {
function* take(iter, count) {
let index = 0;
for (const value of iter) {
if (index >= count) break;
yield value;
index++;
}
}
return new Lazy(take(this.iterator, n));
}
value() {
return [...this.iterator];
}
}
// 工厂函数
Lazy.from = function*(start, step) {
let current = start;
while (true) {
yield current;
current += step;
}
};
// 使用
const result = new Lazy(Lazy.from(1, 1))
.map(x => x ** 2)
.filter(x => x % 2 === 0)
.take(5)
.value();
console.log(result); // [4, 16, 36, 64, 100]
这个 Lazy 类封装了迭代器,并提供链式方法。每个操作都不立即执行,直到调用 value() 展开时才触发计算。
基本上就这些。通过生成器和迭代器,JavaScript 能很好地模拟惰性求值行为,让函数式编程更高效、更优雅。虽然原生不支持,但语言特性足够灵活来实现这一模式。
# javascript
# java
# 大数据
# red
相关栏目:
【
Google疑问12 】
【
Facebook疑问10 】
【
网络优化76771 】
【
技术知识130152 】
【
IDC云计算60162 】
【
营销推广131313 】
【
AI优化88182 】
【
百度推广37138 】
【
网站推荐60173 】
【
精选阅读31334 】
相关推荐:
Python多进程教程_multiprocessing模块实战
c# 在高并发场景下,委托和接口调用的性能对比
Win11文件扩展名怎么显示_Win11查看文件后缀名设置【基础】
跨文件调用类方法怎么用_php作用域操作符与自动加载配合【介绍】
Win11怎么清理C盘虚拟内存_Win11清理虚拟内存设置【教程】
PhpStorm怎么调试PHP代码_PhpStorm断点设置与调试启动步骤【指南】
Win11鼠标灵敏度怎么调 Win11鼠标指针移动速度设置【教程】
Go 中实现 Python urllib.quote() 功能的等效方法
Win11怎么关闭用户账户控制UAC_Windows11更改通知设置等级
如何在Golang中实现RPC异步返回_Golang RPC异步处理与回调方法
Win10怎么卸载迅雷_Win10彻底卸载迅雷方法【步骤】
Win11怎么更改电脑密码_Windows 11修改本地账户密码【步骤】
PHP主流架构如何做单元测试_工具与流程【详解】
Go 语言标准库为何不提供泛型切片的 Contains 方法?
如何使用Golang sort排序切片_Golang sort排序方法示例
Win11怎么设置声音输出设备_Windows11音量合成器单独调节应用
Win11如何设置ipv6 Win11开启IPv6网络协议教程【步骤】
如何在Golang中实现自定义Benchmark_Golang testing.B自定义性能测量示例
c++如何判断文件是否存在_c++ filesystem库用法
Python音视频处理高级项目教程_FFmpegPydub剪辑与特效
Python函数接口稳定性_版本演进解析【指导】
如何在 ACF 中正确更新嵌套多层 Group 字段内的子字段
Windows10任务栏图标变成白色文件_Win10重建图标缓存修复方法
如何处理“XML格式不正确”错误 常见XML well-formed问题解决方法
c++如何实现多态性_c++ 虚函数表原理与动态绑定机制【教程】
Python网络异常模拟_测试说明【指导】
c++中如何进行二进制文件读写_c++ read与write函数用法
Win11搜索栏无法输入_解决Win11开始菜单搜索没反应问题【技巧】
Win10文件历史记录怎么用 Win10开启自动备份文件教程【防丢】
如何在 Go 结构体中正确初始化 map 字段
Win11怎样安装企业微信_Win11安装企业微信教程【步骤】
如何使用Golang实现函数指针_函数变量与回调示例
Win10系统怎么查看网络连接状态_Windows10网络和共享中心
Windows音频驱动无声音原因解析_声卡驱动错误修复步骤
如何使用Golang log设置日志输出格式_Golang log日志格式示例
如何在Golang中实现微服务服务拆分_Golang微服务拆分与接口管理方法
php485能和物联网模块通信吗_php485对接NB-IoT模块实例【说明】
Win11怎么更改系统语言为中文_Windows11安装语言包并设为显示语言
Python字符串操作教程_切片拼接与格式化详解
Windows如何拦截2345弹窗广告_Windows拦截2345弹窗方法【步骤】
Windows10蓝屏SYSTEM_SERVICE_EXCEPTION_Win10驱动冲突排查
Drupal 中 HTML 链接被重复转义导致渲染异常的解决方案
TestNG的testng.xml配置文件怎么写
如何在Golang中捕获HTTP服务器错误_GolangHTTP Handler中error处理
PythonWeb前后端整合项目教程_FastAPIReact完整实例
PHP中require语句后直接调用返回对象方法的语法解析
使用类变量定义字符串常量时如何实现类型安全的 Literal 注解
Win11怎么开启游戏模式_Win11优化游戏帧数性能【教程】
Win11怎么开启远程桌面连接_Windows11系统属性远程设置
Win11怎么关闭应用权限_Windows11相机麦克风隐私管理
2025-11-23
致胜网络推广营销网专注海外推广十年,是谷歌推广.Facebook广告全球合作伙伴,我们精英化的技术团队为企业提供谷歌海外推广+外贸网站建设+网站维护运营+Google SEO优化+社交营销为您提供一站式海外营销服务。