引言
自 ES2015(ES6)发布以来,JavaScript 语言经历了多次重大更新,每年都会引入新特性,极大地提升了开发效率和代码可读性。无论是前端开发还是后端开发,掌握这些新特性都是必不可少的。本文将详细列举从 ES2015 到 ES2023 的所有重要特性,并通过代码示例帮助你快速理解和应用。
目录
1. ES2015(ES6)
ES2015 是 JavaScript 的一次重大更新,引入了许多核心特性:
1.1 let 和 const
-
作用:块级作用域变量声明。
-
示例:
let a = 1; const b = 2;
1.2 箭头函数
-
作用:简化函数写法并绑定
this
。 -
示例:
const add = (a, b) => a + b;
1.3 模板字符串
-
作用:支持多行字符串和嵌入表达式。
-
示例:
const name = 'World'; console.log(`Hello, ${name}!`);
1.4 解构赋值
-
作用:从数组或对象中提取值。
-
示例:
const [x, y] = [1, 2]; const { a, b } = { a: 1, b: 2 };
1.5 默认参数
-
作用:为函数参数设置默认值。
-
示例:
function greet(name = 'World') { console.log(`Hello, ${name}!`); }
1.6 Rest 参数和扩展运算符
-
作用:处理不定参数和数组/对象展开。
-
示例:
function sum(...args) { return args.reduce((a, b) => a + b, 0); } const arr = [...[1, 2], ...[3, 4]];
1.7 类(Class)
-
作用:提供更清晰的面向对象编程语法。
-
示例:
class Animal { constructor(name) { this.name = name; } speak() { console.log(`${this.name} makes a noise.`); } }
1.8 模块化(import/export)
-
作用:支持模块化开发。
-
示例:
// module.js export const foo = 42; // main.js import { foo } from './module.js';
1.9 Promise
-
作用:用于异步编程。
-
示例:
const promise = new Promise((resolve, reject) => { setTimeout(() => resolve('Done!'), 1000); }); promise.then(result => console.log(result));
1.10 Symbol
-
作用:唯一且不可变的数据类型。
-
示例:
const sym = Symbol('key'); const obj = { [sym]: 'value' };
1.11 迭代器和生成器
-
作用:支持自定义迭代行为。
-
示例:
function* gen() { yield 1; yield 2; } const iterator = gen(); console.log(iterator.next().value); // 1
1.12 Map 和 Set
-
作用:新的数据结构。
-
示例:
const map = new Map(); map.set('key', 'value'); const set = new Set([1, 2, 3]);
1.13 Proxy 和 Reflect
-
作用:元编程工具。
-
示例:
const target = {}; const handler = { get(target, prop) { return prop in target ? target[prop] : 42; } }; const proxy = new Proxy(target, handler); console.log(proxy.foo); // 42
1.14 新的数组方法
-
作用:增强数组操作。
-
示例:
const arr = [1, 2, 3]; console.log(Array.from('foo')); // ['f', 'o', 'o'] console.log(arr.find(x => x > 1)); // 2
1.15 对象字面量增强
-
作用:简化对象定义。
-
示例:
const a = 1, b = 2; const obj = { a, b, method() {} };
2. ES2016(ES7)
2.1 Array.prototype.includes()
-
作用:检查数组是否包含某个元素。
-
示例:
[1, 2, 3].includes(2); // true
2.2 指数运算符
-
作用:简化指数运算。
-
示例:
2 ** 3; // 8
3. ES2017(ES8)
3.1 async/await
-
作用:简化异步代码。
-
示例:
async function fetchData() { const data = await fetch('/api/data'); console.log(data); }
3.2 Object.values() 和 Object.entries()
-
作用:获取对象的值或键值对。
-
示例:
const obj = { a: 1, b: 2 }; console.log(Object.values(obj)); // [1, 2] console.log(Object.entries(obj)); // [['a', 1], ['b', 2]]
3.3 字符串填充方法
-
作用:在字符串前后填充字符。
-
示例:
'x'.padStart(4, '0'); // '000x' 'x'.padEnd(4, '0'); // 'x000'
3.4 Object.getOwnPropertyDescriptors()
-
作用:获取对象属性的描述符。
-
示例:
const obj = { a: 1 }; console.log(Object.getOwnPropertyDescriptors(obj));
3.5 共享内存和 Atomics
-
作用:用于多线程编程。
-
示例:
const buffer = new SharedArrayBuffer(16); const view = new Int32Array(buffer); Atomics.add(view, 0, 1);
4. ES2018(ES9)
4.1 异步迭代器
-
作用:支持异步迭代。
-
示例:
async function* asyncGen() { yield 1; yield 2; } for await (const value of asyncGen()) { console.log(value); }
4.2 Rest/Spread 属性
-
作用:支持对象解构和展开。
-
示例:
const { a, ...rest } = { a: 1, b: 2, c: 3 }; const newObj = { ...rest, d: 4 };
4.3 Promise.prototype.finally()
-
作用:无论 Promise 成功或失败都会执行。
-
示例:
promise.finally(() => console.log('Done'));
4.4 正则表达式改进
-
作用:增强正则表达式功能。
-
示例:
const regex = /(?<year>\d{4})-(?<month>\d{2})/; const match = regex.exec('2023-10'); console.log(match.groups.year); // 2023
5. ES2019(ES10)
5.1 Array.prototype.flat() 和 flatMap()
-
作用:扁平化数组。
-
示例:
[1, [2]].flat(); // [1, 2] [1, 2].flatMap(x => [x * 2]); // [2, 4]
5.2 Object.fromEntries()
-
作用:将键值对列表转换为对象。
-
示例:
const entries = [['a', 1], ['b', 2]]; const obj = Object.fromEntries(entries); // { a: 1, b: 2 }
5.3 字符串的 trimStart() 和 trimEnd()
-
作用:去除字符串前后空格。
-
示例:
' abc '.trimStart(); // 'abc ' ' abc '.trimEnd(); // ' abc'
5.4 可选的 catch 绑定
-
作用:无需绑定错误变量。
-
示例:
try {} catch {}
5.5 Function.prototype.toString() 改进
-
作用:返回函数的完整源码。
-
示例:
function foo() {} console.log(foo.toString());
6. ES2020(ES11)
6.1 可选链操作符(Optional Chaining)
-
作用:简化属性访问。
-
示例:
const value = obj?.a?.b;
6.2 空值合并操作符(Nullish Coalescing)
-
作用:提供默认值。
-
示例:
const value = a ?? 'default';
6.3 BigInt
-
作用:支持大整数。
-
示例:
const bigNum = 123n;
6.4 动态导入(Dynamic Import)
-
作用:动态加载模块。
-
示例:
const module = await import('./module.js');
6.5 globalThis
-
作用:统一的全局对象访问方式。
-
示例:
console.log(globalThis === window); // true (浏览器环境)
6.6 Promise.allSettled()
-
作用:无论成功或失败,都会返回结果。
-
示例:
Promise.allSettled([promise1, promise2]);
7. ES2021(ES12)
7.1 String.prototype.replaceAll()
-
作用:替换所有匹配的子串。
-
示例:
'aabbcc'.replaceAll('b', 'x'); // 'aaxxcc'
7.2 Promise.any()
-
作用:返回第一个成功的 Promise。
-
示例:
Promise.any([promise1, promise2]);
7.3 逻辑赋值操作符
-
作用:简化逻辑赋值。
-
示例:
a ||= b; // a = a || b a &&= b; // a = a && b a ??= b; // a = a ?? b
7.4 WeakRef
-
作用:弱引用。
-
示例:
const ref = new WeakRef(obj);
7.5 数字分隔符
-
作用:提高数字可读性。
-
示例:
const num = 1_000_000;
8. ES2022(ES13)
8.1 类的静态块
-
作用:静态初始化代码。
-
示例:
class MyClass { static { console.log('Static block'); } }
8.2 私有字段和方法
-
作用:支持私有成员。
-
示例:
class MyClass { #privateField = 42; #privateMethod() {} }
8.3 at() 方法
-
作用:支持负索引访问。
-
示例:
'abc'.at(-1); // 'c' [1, 2, 3].at(-1); // 3
8.4 Error Cause
-
作用:错误链支持。
-
示例:
throw new Error('message', { cause: error });
9. ES2023(ES14)
9.1 Array.prototype.findLast() 和 findLastIndex()
-
作用:从后向前查找数组元素。
-
示例:
[1, 2, 3].findLast(x => x > 1); // 3 [1, 2, 3].findLastIndex(x => x > 1); // 2
9.2 Hashbang 语法支持
-
作用:在脚本文件中支持
#!
。 -
示例:
#!/usr/bin/env node console.log('Hello, World!');
总结
从 ES2015 到 ES2023,JavaScript 新增了大量特性,涵盖了语法糖、异步编程、数据结构、元编程等多个方面。这些特性极大地提升了开发效率和代码可读性。建议根据项目需求逐步学习和应用这些新特性。
互动话题
你最喜欢哪个 ES 新特性?在实际开发中是否已经用上了?欢迎在评论区分享你的看法!