近年来,JavaScript 日新月异,新特性层出不穷。本文汇总了 2025 年陆续推出的一系列令人耳目一新的特性,它们不仅优化了代码性能,还极大地提高了开发效率。从高效的迭代器操作到便捷的 Promise 工具,再到高级对象克隆与集合操作,快来一起了解这些你可能还不熟悉的小技巧吧!
1. 迭代器辅助方法:高效链式操作
曾经我们在处理大数组时,经常会使用多次链式调用,如:
arr.slice(10, 20).filter(el => el < 10).map(el => el + 5);
这种方式每一步都生成一个新数组,内存占用严重,尤其当数组较大(500K+)时更是问题多多。为此,JavaScript 引入了一系列迭代器辅助方法。这些方法与数组转换方法类似,但不会产生临时数组,而是通过新迭代器进行连续操作,最终生成你需要的数据。
常用方法包括:
- • drop() :跳过迭代器开头指定数量的元素。
- • take() :仅获取迭代器中前 n 个元素。
- • filter()、map()、find()、flatMap() 等:功能与数组对应方法类似。
- • reduce()、forEach()、some()、every() 等方法:直接作用于迭代器中的元素。
- • toArray() :将迭代器生成的结果转换为数组。
结合实践,我们可以这样编写代码:
arr.values()
.drop(10)
.take(10)
.filter(el => el < 10)
.map(el => el + 5)
.toArray();
小提示:目前部分主流浏览器还未全面支持(Safari 从 2025 年 3 月 31 日开始支持),所以项目中请酌情使用或等待稳定支持。
2. Array 的 at() 方法:灵活的下标访问
传统的数组下标访问(例如 arr[arr.length - 1])容易写出冗长的代码。新推出的 at() 方法不仅能像常规方式一样访问第 n 个元素,还支持负数下标直接从数组末尾获取值,例如:
[10, 20, 30].at(-1); // 返回 30
[10, 20, 30].at(-2); // 返回 20
这一语法糖让数组操作更加便捷,代码更简洁。
3. Promise.withResolvers():更优雅的异步处理
为了避免传统写法中不得不先定义变量后再赋值的麻烦,我们现可以直接用 Promise 的新方法:
传统写法:
let resolve, reject;
const promise = new Promise((resolver, rejector) => {
resolve = resolver;
reject = rejector;
});
新写法:
const { promise, resolve, reject } = Promise.withResolvers();
// 后续直接使用 promise, resolve, reject
这一变化使得代码显得更优雅,同时也减少了潜在的错误。
4. String.replace()/replaceAll() 的回调参数
以前我们通常传递字符串作为第二个参数来替换目标字符,而现在你也可以传回调函数,从而根据匹配内容动态生成替换字符串。例如:
let counter = 0;
console.log(
"NUMBER, NUMBER, NUMBER".replaceAll("NUMBER", (match) => match + "=" + (++counter))
);
// 输出:NUMBER=1, NUMBER=2, NUMBER=3
这种用法不仅方便,还能提高性能和节省内存。
5. 变量交换:解构赋值让代码更简洁
交换变量的传统方式需要一个临时变量,而现在可以直接利用解构赋值:
let a = 1, b = 2;
[a, b] = [b, a];
这种写法简单明了,也是 ES6 的一大亮点。
6. structuredClone():万能对象克隆助手
深拷贝对象时,我们传统上可能会借助 JSON.stringify() 和 JSON.parse(),但这种方式对于 NaN、undefined、bigint 甚至循环引用都不够友好。现代浏览器推出了 structuredClone(),可以直接实现高效且准确的深拷贝:
const obj = {};
obj.selfReference = obj;
const clonedObj = structuredClone(obj);
console.log(clonedObj); // 完全克隆,并保持对象引用结构一致
7. Tagged Templates:给模板字面量解绑更多可能
Tagged templates 让你可以使用一个函数来预处理模板字面量,充分控制插值数据。例如,自动对 HTML 内容进行转义:
function escapeHtml(strings, ...values) {
const div = document.createElement("div");
let output = strings[0];
for (let i = 0; i < values.length; i++) {
div.innerText = values[i];
output += div.innerHTML + strings[i + 1];
}
return output;
}
console.log(escapeHtml`<br>${'<br>'}`);
// 输出:<br><br>
这种方式特别适合前端安全性处理,减少 XSS 风险。
📌 关注我,获取更多技术干货,一起探索计算的无限可能!
梦兽的百变衣橱
不定期更新美女穿搭/游戏/汽车资讯
32篇原创内容
**
公众号
8. WeakMap 与 WeakSet:自动垃圾回收的好伙伴
与普通的 Map 和 Set 不同,WeakMap 和 WeakSet 的键值对只接受对象,不支持原始类型,并且当这些对象失去所有引用时,会自动被垃圾回收。这样既能保证数据关联,又不会造成内存泄漏,是构建高效应用的重要工具。
9. Set 的布尔操作:轻松实现集合运算
最近,JS 对 Set 进行了扩展,新增了若干布尔操作方法,可直接对集合进行差集、交集、并集和对称差集等操作。例如:
- • difference() :返回当前集合与给定集合的差集。
const set1 = new Set([1,2,3,4]);
const set2 = new Set([3,4,5,6]);
console.log(set1.difference(set2)); // Set(2) {1, 2}
- • intersection() :返回交集。
const set1 = new Set([1,2,3,4]);
const set2 = new Set([3,4,5,6]);
console.log(set1.intersection(set2)); // Set(2) {3, 4}
- • union() :返回并集。
const set1 = new Set([1,2,3,4]);
const set2 = new Set([3,4,5,6]);
console.log(set1.union(set2)); // Set(6) {1, 2, 3, 4, 5, 6}⎘
- • symmetricDifference() :返回对称差集。
const set1 = new Set([1,2,3,4]);
const set2 = new Set([3,4,5,6]);
console.log(set1.symmetricDifference(set2)); // Set(4) {1, 2, 5, 6}
- • isDisjointFrom() :判断两个集合是否没有交集。
const set1 = new Set([1,2,3,4]);
const set2 = new Set([3,4,5,6]);
const set3 = new Set([5,6]);
console.log(set1.isDisjointFrom(set2)); // false
console.log(set1.isDisjointFrom(set3)); // true
- • isSubsetOf() :判断当前集合是否为给定集合的子集。
const set1 = new Set([1,2,3,4]);
const set2 = new Set([3,4,5,6]);
const set3 = new Set([5,6]);
console.log(set1.isSubsetOf(set2)); // false
console.log(set3.isSubsetOf(set2)); // true
- • isSupersetOf() :判断当前集合是否为给定集合的超集。
const set1 = new Set([1,2,3,4]);
const set2 = new Set([3,4,5,6]);
const set3 = new Set([5,6]);
console.log(set2.isSupersetOf(set1)); // false
console.log(set2.isSupersetOf(set3)); // true
这些方法极大地方便了数据集合的操作,写出更优雅、功能更强大的代码。
总结
2025 年的 JavaScript 在原有基础上进行了诸多创新与优化,主要体现在以下几个方面:
- • 迭代器辅助方法:降低内存消耗,提高数据流处理效率。
- • 数组 at() 方法:支持负索引,简化了数组访问。
- • Promise.withResolvers() :更直观的异步代码写法。
- • 字符串替换回调:动态替换更高效。
- • 解构赋值用于变量交换:代码更简洁。
- • structuredClone() :高效且安全的对象深拷贝。
- • Tagged Templates:精细控制模板字符串,保障前端安全。
- • WeakMap/WeakSet:实现无副作用的对象关联。
- • Set 布尔操作:方便集合计算和比较。
这些新特性使得 JavaScript 编程更加高效、灵活。无论你是在处理数据、编写异步逻辑,还是进行前端安全处理,这些 API 的更新都能显著改进代码质量和运行效率。
别忘记关注「梦兽编程」微信公众号,获取更多前沿技术分享、实战案例与专业教程,让你的代码世界越来越精彩!
Happy coding!