ES2020(ES11)除了可选链操作符(?.
)和空值合并操作符(??
),还引入了多个实用特性,进一步提升了JavaScript的开发体验。以下是其他重要特性及其实用场景:
1. 动态导入(Dynamic Import)
允许在运行时动态加载模块,支持按需加载,优化代码分割和性能。
// 传统静态导入(编译时加载)
import { utils } from './utils.js';
// 动态导入(返回Promise,运行时加载)
button.addEventListener('click', async () => {
const module = await import('./heavy-module.js');
module.doHeavyWork(); // 按需执行模块中的功能
});
适用场景:
- 路由懒加载(如React/Vue的路由组件按需加载)
- 大型库的部分功能按需引入(如只在需要时加载图表库)
2. BigInt:任意精度整数
解决了传统Number
类型无法表示大于2^53 - 1
整数的问题,支持任意长度的整数运算。
// 声明BigInt:在数字后加n或用BigInt()构造函数
const bigNum1 = 9007199254740993n;
const bigNum2 = BigInt('9007199254740993');
// 运算(需与BigInt类型一起使用)
const sum = bigNum1 + bigNum2; // 18014398509481986n
// 与Number类型转换(注意精度可能丢失)
const num = Number(sum);
适用场景:
- 处理超大整数(如金融交易、密码学、高精度计算)
- 避免大数运算中的精度丢失(如后端返回的雪花ID)
3. String.prototype.matchAll()
返回一个迭代器,包含字符串中所有正则匹配的结果(包括捕获组),方便一次性获取所有匹配。
const str = 'JavaScript ES2020, TypeScript 4.5';
const regex = /(\w+)\s+(\d+\.\d+|\d+)/g;
// 传统方式:需要循环exec()
let match;
while ((match = regex.exec(str)) !== null) {
console.log(match[1], match[2]); // JavaScript 2020, TypeScript 4.5
}
// matchAll()方式:更简洁
for (const match of str.matchAll(regex)) {
console.log(match[1], match[2]); // 同上
}
优势:
- 避免手动管理正则的
lastIndex
(防止循环中出错) - 可结合扩展运算符或数组方法一次性处理所有结果
4. globalThis
提供了一个统一的全局对象引用,解决了不同环境(浏览器、Node.js、Web Worker等)中全局对象不一致的问题。
// 不同环境的全局对象
// 浏览器:window;Node.js:global;Web Worker:self
// 统一访问
console.log(globalThis); // 指向当前环境的全局对象
// 在跨环境代码中使用
globalThis.setTimeout(() => {
console.log('统一的定时器调用');
}, 1000);
适用场景:
- 编写跨环境通用的库或工具(无需判断运行环境)
5. 模块命名空间导出(export * as ns from 'module')
简化模块导出语法,可将另一个模块的所有导出作为命名空间导出。
// utils.js
export const add = (a, b) => a + b;
export const multiply = (a, b) => a * b;
// math.js
export * as utils from './utils.js'; // 将utils.js的导出作为utils命名空间
// 使用时
import { utils } from './math.js';
console.log(utils.add(2, 3)); // 5
优势:
- 避免大量
export { x } from 'module'
的重复写法 - 清晰组织模块的导出结构
6. Promise.allSettled()
等待所有Promise完成(无论成功或失败),返回包含所有结果的数组,适合需要知道所有异步操作结果的场景。
const promises = [
Promise.resolve('成功1'),
Promise.reject('失败1'),
Promise.resolve('成功2')
];
// Promise.all():只要有一个失败就会 reject
// Promise.allSettled():等待所有完成,返回每个结果
Promise.allSettled(promises).then(results => {
results.forEach(result => {
if (result.status === 'fulfilled') {
console.log('成功:', result.value);
} else {
console.log('失败:', result.reason);
}
});
});
适用场景:
- 批量请求接口时,需要收集所有成功和失败的结果(如表单提交多个字段验证)
这些特性进一步增强了JavaScript的功能和灵活性,尤其在异步处理、模块化、跨环境兼容等方面提供了更优雅的解决方案,已被现代浏览器和Node.js广泛支持。