Node.js v26.0 新增超甜的语法糖 getOrInsert / getOrInsertComputed 介绍

Node.js v26.0 给MapWeakMap加了两个新方法:getOrInsertgetOrInsertComputed

getOrInsert 接收一个默认值。如果键存在,直接返回对应的值;如果不存在,插入这个默认值,然后返回。

js 复制代码
// 以前
if (!map.has(key)) {
  map.set(key, []);
}
map.get(key).push(value);
js 复制代码
// 以后
map.getOrInsert(key, []).push(value);

一行搞定。

你看看这个对比,是不是爽多了?

getOrInsertComputed 接收一个回调函数,只在需要插入的时候才调用。适合默认值计算开销比较大的场景。

js 复制代码
// 计算默认值是很贵的操作
map.getOrInsertComputed(key, () => cpuIntensiveComputation(key));

如果键已经存在,回调根本不会执行,省时省力。


实战案例:分组、计数

我们来几个真实场景,感受一下。

场景一:分组

以前写分组:

js 复制代码
let grouped = new Map();
for (let [key, ...values] of data) {
  if (grouped.has(key)) {
    grouped.get(key).push(...values);
  } else {
    grouped.set(key, values);
  }
}

用新API:

js 复制代码
let grouped = new Map();
for (let [key, ...values] of data) {
  grouped.getOrInsert(key, []).push(...values);
}

代码量直接砍半。

场景二:计数器

以前写计数器:

js 复制代码
let counts = new Map();
if (counts.has(key)) {
  counts.set(key, counts.get(key) + 1);
} else {
  counts.set(key, 1);
}

上述代码我们在 LeetCode 考察 HashMap 题目中屡见不鲜。

用新API:

js 复制代码
let counts = new Map();
counts.set(key, counts.getOrInsert(key, 0) + 1);

getOrInsert(key, 0)保证了初始值0存在,然后直接加1。


性能的考量

有人可能会问,getOrInsert内部是怎么实现的?

提案的设计保证了一次查找搞定。你可以把它想象成get,如果没找到就set,然后返回。整个过程只做一次哈希查找。

getOrInsertComputed呢?也是只查一次,而且回调只在需要插入时才调用,不会有额外开销。

对比传统的has + get/set,那是两次甚至三次查找。所以新API不仅更简洁,理论上还更快。


那WeakMap呢?

提案同时给WeakMap也加了同样的方法。

用法一模一样,但要注意WeakMap的键必须是对象,默认值回调里返回的也得是对象。

js 复制代码
let wm = new WeakMap();
let obj = {};
wm.getOrInsert(obj, { count: 0 });

WeakMap的场景主要是缓存临时数据,有了这个方法就不用每次先has了。

最后问大家

下面两段代码有什么问题?

js 复制代码
map.set(key, map.get(key) || defaultValue);
js 复制代码
map.set(key, map.get(key) ?? defaultValue);

或者说用 getOrInsert 除了简洁能解决什么问题?

相关推荐
笨鸟先飞,勤能补拙10 分钟前
AI 安全的下一个 5 年:从 Agent 到 AGI 的攻防博弈
人工智能·python·安全·web安全·网络安全·github·agi
Logintern0933 分钟前
LangSmith如何根据id关系,在服务端把扁平列表重建为树形结构,用于页面渲染Trace视图
python
月光船幽幽1 小时前
呼吸孔设计重塑系统稳定性
python·科技·算法
Bryce学亮1 小时前
FileLine,基于 Qt 6 + QML 构建的跨平台文件传输与即时通讯工具
数据库·c++·人工智能·python·qt·github
拿铁铁1 小时前
2026实操场景下平板坡口机噪音问题注意事项梳理汇总
python·电脑
夜雪一千1 小时前
Python从HTML提取纯文本、去空格、比对内容是否变化:方案+合理性分析
开发语言·python·html
烂蜻蜓1 小时前
Node.js入门教程(一):初识Node.js——服务端JavaScript的诞生与特点
开发语言·javascript·node.js
Zane19942 小时前
同一个 list 为什么能被两个 for 循环同时遍历?一文讲透可迭代对象与迭代器的真相
后端·python
月走乂山3 小时前
零依赖 GUI:把 OpenCode CLI 变成可视化 AI 任务流水线
python·自动化·ai编程·tkinter·opencode
孙启超3 小时前
【AI应用开发】Agent 无限 loop(反复调用同一个工具)如何规避?
人工智能·python·算法·llm·agent·loop·ai应用开发