在JavaScript的日常开发中,我们往往依赖于一些常用的核心API,但ES6及后续版本中引入的一些“冷门”工具,却能在特定场景下显著提升代码的简洁性与健壮性。本文将深入解析8个容易被忽略但极其实用的ES6+ API,助你写出更优雅、更高效的代码。
1. Object.fromEntries()
Object.entries()方法将对象转换为键值对数组已被广泛使用,而它的逆操作Object.fromEntries()则能将符合特定格式的二维数组或可迭代对象(如Map)重新组合成一个对象。
const arr = [['name', 'Tom'], ['age', 18]];
const obj = Object.fromEntries(arr);
console.log(obj); // { name: "Tom", age: 18 }
它在处理URL查询参数时尤为方便:
const params = new URLSearchParams('a=1&b=2');
console.log(Object.fromEntries(params)); // { a: "1", b: "2" }
2. Array.prototype.flat() 与 flatMap()
手动递归或使用reduce来展平多维数组的时代已经过去。flat()方法接受一个深度参数,可以轻松“拍平”数组。
[1, [2, [3]]].flat(2); // [1, 2, 3]
flatMap()则更为强大,它相当于先对数组每个元素执行map(),再将结果展平一层。这在处理算法和数据结构问题时非常高效。
const arr = [1, 2, 3];
const res = arr.flatMap(x => [x, x * 2]);
// 结果: [1, 2, 2, 4, 3, 6]
3. Promise.allSettled()
与Promise.all()不同,Promise.allSettled()不会因为单个Promise被拒绝而短路。它会等待所有Promise完成(无论成功或失败),并返回一个描述每个Promise结果的对象数组。
const promises = [
Promise.resolve(1),
Promise.reject('出错啦'),
Promise.resolve(3)
];
Promise.allSettled(promises).then(console.log);
// 输出: [
// { status: "fulfilled", value: 1 },
// { status: "rejected", reason: "出错啦" },
// { status: "fulfilled", value: 3 }
// ]
这非常适用于需要获取批量异步操作最终状态,且不希望单点失败影响整体结果收集的场景。
4. String.prototype.replaceAll()
以往需要替换字符串中所有匹配项时,必须使用带有全局标志g的正则表达式。现在,replaceAll()让这一操作变得直观。
"aaa---aaa".replaceAll("a", "b");
// 结果: "bbb---bbb"
5. Array.prototype.at()
该方法支持传入负数索引,用于访问从数组末尾开始计数的元素,让代码意图更清晰。
const arr = [10, 20, 30];
arr.at(-1); // 30,等同于 arr[arr.length - 1]
arr.at(-2); // 20
6. Object.hasOwn()
obj.hasOwnProperty()方法存在被对象自身覆盖或原型链上无此方法的风险。Object.hasOwn()以静态方法的形式提供了更安全、语义更清晰的属性存在性检查。
const obj = Object.create(null); // 创建一个没有原型的对象
obj.x = 1;
console.log(Object.hasOwn(obj, "x")); // true
7. Promise.any()
与Promise.race()类似,但Promise.any()只关心是否有Promise成功。它接收一个Promise集合,并在其中任意一个成功时立即成功,仅当所有Promise都失败时才失败。
const list = [
Promise.reject('CDN A失败'),
Promise.resolve('CDN B成功'),
Promise.reject('CDN C失败')
];
Promise.any(list).then(console.log); // 输出: 'CDN B成功'
这在实现多资源冗余加载(如从多个CDN源获取同个资源)时非常有用。
8. globalThis
在JavaScript的不同运行环境中,指向全局对象的属性各不相同(浏览器为window,Node.js为global,Web Workers为self)。globalThis提供了一个标准化的方式,让你无需判断环境即可访问全局对象。
// 在任何环境中都可用
globalThis.myGlobalVar = 'Hello';
console.log(globalThis.myGlobalVar); // 'Hello'
掌握这些API,并非追求新奇,而是为了在合适的场景下使用最恰当的工具。它们能够有效减少冗余代码,提升逻辑的清晰度与健壮性,是现代JavaScript开发者高效编程的得力助手。