ECMAScript(简称ES)是JavaScript的标准,每年都会发布一个新版本,从ES6(2015年)到ES14(2023年),每个版本都引入了新的特性和改进。以下是每个版本的一些主要特性及其使用方式和应用场景:
ES6 (2015)
let 和 const
- 用法:
let x = 1; const y = 2;
- 场景: 块级作用域变量声明,避免变量提升导致的错误。
- 用法:
箭头函数
- 用法:
const add = (a, b) => a + b;
- 场景: 更简洁的函数表达式,自动绑定
this
。
- 用法:
模板字符串
- 用法:
const message = `Hello, ${name}!`;
- 场景: 多行字符串和字符串插值。
- 用法:
类(Class)
用法:
class Person { constructor(name) { this.name = name; } greet() { console.log(`Hello, ${this.name}`); } }
- 场景: 面向对象编程。
解构赋值
用法:
const [a, b] = [1, 2]; const {name, age} = {name: 'Alice', age: 25};
- 场景: 从数组或对象中提取值。
默认参数
- 用法:
function multiply(a, b = 1) { return a * b; }
- 场景: 函数参数有默认值。
- 用法:
Promise
用法:
const promise = new Promise((resolve, reject) => { // async operation }); promise.then(result => {}).catch(error => {});
- 场景: 处理异步操作。
ES7 (2016)
指数操作符
- 用法:
const result = 2 ** 3;
- 场景: 代替
Math.pow
。
- 用法:
Array.prototype.includes
- 用法:
const hasValue = [1, 2, 3].includes(2);
- 场景: 检查数组中是否包含某个值。
- 用法:
ES8 (2017)
async/await
用法:
async function fetchData() { const response = await fetch('url'); const data = await response.json(); return data; }
- 场景: 更简洁的异步代码。
Object.values 和 Object.entries
用法:
const values = Object.values({a: 1, b: 2}); const entries = Object.entries({a: 1, b: 2});
- 场景: 获取对象的值或键值对数组。
ES9 (2018)
异步迭代
用法:
for await (const value of asyncIterable) { console.log(value); }
- 场景: 处理异步数据流。
Rest/Spread 属性
用法:
const {a, ...rest} = {a: 1, b: 2, c: 3}; const newObj = {...oldObj, d: 4};
- 场景: 复制和合并对象。
ES10 (2019)
Array.prototype.flat 和 flatMap
用法:
const flattened = [1, [2, 3]].flat(); const flatMapped = [1, 2, 3].flatMap(x => [x, x * 2]);
- 场景: 扁平化数组。
Object.fromEntries
用法:
const obj = Object.fromEntries([['a', 1], ['b', 2]]);
- 场景: 将键值对列表转为对象。
String.prototype.trimStart 和 trimEnd
- 用法:
const str = ' hello '.trimStart();
- 场景: 去除字符串的首尾空格。
- 用法:
ES11 (2020)
可选链(Optional Chaining)
- 用法:
const value = obj?.prop?.subProp;
- 场景: 安全地访问嵌套属性。
- 用法:
Nullish Coalescing
- 用法:
const value = a ?? 'default';
- 场景: 处理 null 或 undefined 值。
- 用法:
BigInt
- 用法:
const bigInt = 123n;
- 场景: 表示任意精度的整数。
- 用法:
Promise.allSettled
用法:
const promises = [promise1, promise2]; Promise.allSettled(promises).then(results => console.log(results));
- 场景: 等待所有 Promise 完成,无论成功或失败。
ES12 (2021)
逻辑赋值运算符
用法:
a ||= b; // 等同于 a || (a = b); a &&= b; // 等同于 a && (a = b); a ??= b; // 等同于 a ?? (a = b);
- 场景: 简化赋值操作。
String.prototype.replaceAll
- 用法:
const newStr = 'aabbcc'.replaceAll('b', 'd');
- 场景: 全局替换字符串中的子串。
- 用法:
WeakRefs 和 FinalizationRegistry
用法:
let ref = new WeakRef(someObject); let registry = new FinalizationRegistry((heldValue) => { console.log(heldValue); }); registry.register(someObject, 'some metadata');
- 场景: 高级内存管理。
ES13 (2022)
顶层 await
用法:
const response = await fetch('url'); const data = await response.json();
- 场景: 在模块顶层使用 await。
类字段声明
用法:
class MyClass { myField = 10; #privateField = 20; }
- 场景: 简化类属性声明,支持私有属性。
ES14 (2023)
Array.prototype.toSorted
用法:
const sortedArray = [3, 1, 2].toSorted();
- 场景: 返回排序的新数组,而不改变原数组。
Symbol.asIntN 和 Symbol.asUintN
用法:
const int8 = Symbol.asIntN(8, 128); // -128 const uint8 = Symbol.asUintN(8, 256); // 0
- 场景: 处理大整数。
WeakMap.prototype.emplace 和 WeakSet.prototype.emplace
用法:
const wm = new WeakMap(); wm.emplace(key, { insert: () => 'new value', update: (value) => 'updated value' });
- 场景: 提供更灵活的键值操作。
这些新特性和改进不仅增强了JavaScript的功能性和表现力,还使得编写更简洁、高效和安全的代码成为可能。