ES6(ECMAScript 2015)是 JavaScript 语言历史上一次重大的更新,引入了大量现代化的语法和特性,极大地提升了语言的表达能力、开发效率和代码可维护性。以下是 ES6 的主要新特性,按类别进行归纳:
一、 变量与作用域
let
和const
:let
:声明块级作用域的变量,解决了var
的变量提升(Hoisting)和作用域混乱问题。const
:声明块级作用域的常量,一旦赋值后不能重新赋值(对于对象/数组,其引用不能变,但内部属性/元素可以修改)。
二、 函数增强
- 箭头函数 (Arrow Functions)
=>
:- 提供更简洁的函数语法。
- 不绑定自己的
this
,其this
继承自外层作用域(词法绑定),解决了回调函数中this
指向问题。 - 没有
arguments
对象。 - 不能用作构造函数(不能
new
调用)。
- 函数参数默认值 (Default Parameters):
- 允许在函数定义时为参数指定默认值。
function greet(name = 'Guest') { console.log(`Hello, ${name}!`); }
- 剩余参数 (Rest Parameters)
...
:- 将函数的多个参数收集到一个数组中。
function sum(...numbers) { return numbers.reduce((a, b) => a + b, 0); }
- 扩展运算符 (Spread Operator)
...
:- 将数组或可迭代对象“展开”为多个元素,常用于数组合并、函数参数传递、对象合并等。
三、 对象与类
- 对象字面量的增强:
- 属性简写:
const name = 'Alice'; const obj = { name }; // 等价于 { name: name }
- 方法简写:
const obj = { method() { ... } }; // 等价于 { method: function() { ... } }
- 计算属性名:
const key = 'dynamic'; const obj = { [key]: 'value' };
- 属性简写:
- 解构赋值 (Destructuring Assignment):
- 从数组或对象中提取值,并赋值给变量。
class
关键字:- 提供了基于原型的“类”的语法糖,使面向对象编程更直观。包含
constructor
构造函数、extends
继承、super
调用父类等。
- 提供了基于原型的“类”的语法糖,使面向对象编程更直观。包含
Symbol
数据类型:- 一种新的原始数据类型,用于创建唯一且不重复的值。
- 常用于作为对象的唯一属性名,避免命名冲突,或定义知名 Symbol(如
Symbol.iterator
)来自定义对象行为。
四、 模块化
- ES Module (ESM):
- 原生的模块系统,使用
import
和export
语法。 - 支持静态分析、Tree Shaking 等优化。
- 与 CommonJS (
require
/module.exports
) 并存,但 ESM 是官方标准和未来方向。
- 原生的模块系统,使用
五、 数据结构
Map
:- 键值对的集合,键可以是任何类型(包括对象、函数),而不仅仅是字符串。
- 保持键值对的插入顺序。
Set
:- 存储唯一值的集合,自动去重。
- 常用于数组去重:
[...new Set([1, 2, 2, 3])] // [1, 2, 3]
WeakMap
和WeakSet
:- 键(
WeakMap
)或值(WeakSet
)是弱引用,不会阻止垃圾回收。 - 适用于存储私有数据或元信息,避免内存泄漏。
- 键(
六、 异步编程
Promise
:- 虽然
Promise
在 ES6 之前已有 Polyfill,但 ES6 将其纳入标准。 - 提供了一种更优雅的方式处理异步操作,解决“回调地狱”(Callback Hell)问题。
- 支持
.then()
、.catch()
、.finally()
链式调用。
- 虽然
七、 其他重要特性
- 模板字符串 (Template Literals):
- 使用反引号
`
定义,支持多行字符串和字符串插值。
- 使用反引号
for...of
循环:- 用于遍历可迭代对象(如数组、字符串、Map、Set、arguments 等)。
- 与
for...in
(遍历对象的可枚举属性)不同。
- 迭代器 (Iterators) 和生成器 (Generators)
function*
:- 迭代器:为对象定义
@@iterator
方法(通常通过Symbol.iterator
),使其可被for...of
遍历。 - 生成器:一种特殊的函数,可以暂停和恢复执行,返回一个迭代器对象。是实现异步编程(如
co
库)的基础。
- 迭代器:为对象定义
Proxy
:- 用于创建一个对象的代理,可以拦截并自定义对象的基本操作(如属性读取、赋值、函数调用等)。
- 是实现响应式系统(如 Vue 3)的核心技术。
Reflect
:- 提供了一组用于操作对象的静态方法,通常与
Proxy
配合使用,提供更一致的 API。
- 提供了一组用于操作对象的静态方法,通常与
- 模块的
export default
和命名导出:- 支持一个模块有多个命名导出 (
export const foo = ...
) 和一个默认导出 (export default bar
)。
- 支持一个模块有多个命名导出 (
总结
ES6 的新特性极大地丰富了 JavaScript 的语言能力,使其从一个主要用于网页脚本的语言,转变为一门能够构建大型复杂应用的现代编程语言。这些特性涵盖了变量声明、函数、对象、类、模块、数据结构、异步处理等多个方面,是现代 JavaScript 开发的基石。掌握这些特性是成为一名合格前端或 Node.js 开发者的必备条件。
THE END