ECMAScript 6 完全入门教程:从基础到实战

系统全面的 ES6 学习指南,涵盖 let/const、箭头函数、解构赋值、Promise、async/await 等核心特性

ECMAScript 6 完全入门教程:从基础到实战

ECMAScript 6(ES6,也称为 ES2015)是 JavaScript 语言的一次重大更新,引入了许多新特性,使 JavaScript 更加强大和现代化。本文为你提供一套系统化的 ES6 学习指南,从基础语法到高级特性,帮助你全面掌握 ES6。

第一章:ES6 基础认知(1-2 周)

1.1 ES6 简介

什么是 ES6

  • ES6 定义:ECMAScript 2015,JavaScript 的第六个版本
  • 发布时间:2015 年 6 月正式发布
  • 重要性:现代 JavaScript 开发的基础
  • 浏览器支持:现代浏览器全面支持,旧浏览器需要 Babel 转译

ES6 核心特性

  • 变量声明:let、const 替代 var
  • 函数增强:箭头函数、默认参数、剩余参数
  • 数据结构:解构赋值、扩展运算符
  • 异步编程:Promise、async/await
  • 面向对象:class、继承、模块化

1.2 环境准备

开发环境

  • Node.js:安装 Node.js(推荐 LTS 版本)
  • 代码编辑器:VS Code、WebStorm 等
  • 浏览器:Chrome、Firefox 等现代浏览器
  • Babel:ES6 转 ES5 工具(兼容旧浏览器)

学习工具

  • 在线编辑器:CodePen、JSFiddle
  • REPL 环境:Node.js REPL、浏览器控制台
  • 文档资源:MDN、ES6 规范文档

第二章:变量与作用域 - let 和 const(基础必学)

2.1 let 关键字

let 的特性

  • 块级作用域:只在代码块内有效
  • 不存在变量提升:必须先声明后使用
  • 暂时性死区:声明前访问会报错
  • 不允许重复声明:同一作用域不能重复声明

let 使用示例

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
// 块级作用域
{
  let a = 1;
  console.log(a); // 1
}
// console.log(a); // ReferenceError

// 循环中的 let
for (let i = 0; i < 3; i++) {
  setTimeout(() => {
    console.log(i); // 0, 1, 2
  }, 100);
}

// 暂时性死区
console.log(x); // ReferenceError
let x = 1;

2.2 const 关键字

const 的特性

  • 常量声明:声明后不能重新赋值
  • 块级作用域:与 let 相同的作用域规则
  • 必须初始化:声明时必须赋值
  • 对象可变:对象属性可以修改

const 使用示例

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
// 基本常量
const PI = 3.14159;
// PI = 3.14; // TypeError

// 对象常量
const obj = { name: "Tom" };
obj.name = "Jerry"; // 可以修改属性
obj.age = 20; // 可以添加属性
// obj = {}; // TypeError,不能重新赋值

// 数组常量
const arr = [1, 2, 3];
arr.push(4); // 可以修改数组
// arr = []; // TypeError

2.3 var vs let vs const

对比总结

  • var:函数作用域,存在变量提升,可以重复声明(不推荐使用)
  • let:块级作用域,不存在变量提升,不能重复声明(推荐用于变量)
  • const:块级作用域,不存在变量提升,不能重复声明,不能重新赋值(推荐用于常量)

使用建议

  • 优先使用 const:如果值不会改变,使用 const
  • 需要重新赋值用 let:如果值需要改变,使用 let
  • 避免使用 var:除非特殊需求,不使用 var

第三章:函数增强 - 箭头函数与参数(核心特性)

3.1 箭头函数

箭头函数语法

  • 基本语法(参数) => { 函数体 }
  • 简化形式:单参数可省略括号,单表达式可省略大括号
  • this 绑定:箭头函数不绑定 this,继承外层 this
  • 不能作为构造函数:不能使用 new 调用

箭头函数示例

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
// 基本语法
const add = (a, b) => {
  return a + b;
};

// 简化形式
const multiply = (a, b) => a * b;

// 单参数
const square = (x) => x * x;

// 无参数
const greet = () => console.log("Hello");

// this 绑定
const obj = {
  name: "Tom",
  getName: function () {
    setTimeout(() => {
      console.log(this.name); // Tom,箭头函数继承外层 this
    }, 100);
  },
};

3.2 默认参数

默认参数语法

  • 基本用法:函数参数可以设置默认值
  • 表达式默认值:可以使用表达式作为默认值
  • 默认参数位置:默认参数通常在参数列表末尾

默认参数示例

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
// 基本默认参数
function greet(name = "Guest") {
  console.log(`Hello, ${name}`);
}
greet(); // Hello, Guest
greet("Tom"); // Hello, Tom

// 表达式默认值
function createUser(name, age = 18, active = true) {
  return { name, age, active };
}

// 函数调用作为默认值
function getDefaultValue() {
  return 10;
}
function calculate(a, b = getDefaultValue()) {
  return a + b;
}

3.3 剩余参数

剩余参数语法

  • 基本用法:使用 ...参数名 收集剩余参数
  • 必须是最后一个参数:剩余参数必须在参数列表最后
  • 替代 arguments:推荐使用剩余参数替代 arguments

剩余参数示例

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
// 基本用法
function sum(...numbers) {
  return numbers.reduce((a, b) => a + b, 0);
}
sum(1, 2, 3, 4); // 10

// 与其他参数结合
function greet(greeting, ...names) {
  names.forEach((name) => {
    console.log(`${greeting}, ${name}`);
  });
}
greet("Hello", "Tom", "Jerry", "Bob");

// 替代 arguments
function oldWay() {
  const args = Array.from(arguments);
  console.log(args);
}

function newWay(...args) {
  console.log(args);
}

第四章:解构赋值 - 简化数据提取(实用特性)

4.1 数组解构

数组解构语法

  • 基本语法const [a, b] = array
  • 跳过元素:使用空位跳过不需要的元素
  • 默认值:可以为解构变量设置默认值
  • 剩余元素:使用 ...rest 收集剩余元素

数组解构示例

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
// 基本解构
const arr = [1, 2, 3];
const [a, b, c] = arr;
console.log(a, b, c); // 1, 2, 3

// 跳过元素
const [first, , third] = [1, 2, 3];
console.log(first, third); // 1, 3

// 默认值
const [x = 0, y = 0] = [1];
console.log(x, y); // 1, 0

// 剩余元素
const [head, ...tail] = [1, 2, 3, 4];
console.log(head, tail); // 1, [2, 3, 4]

// 交换变量
let a = 1,
  b = 2;
[a, b] = [b, a];
console.log(a, b); // 2, 1

4.2 对象解构

对象解构语法

  • 基本语法const { name, age } = obj
  • 重命名const { name: newName } = obj
  • 默认值:可以为解构变量设置默认值
  • 嵌套解构:可以解构嵌套对象

对象解构示例

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
// 基本解构
const user = { name: "Tom", age: 20 };
const { name, age } = user;
console.log(name, age); // Tom, 20

// 重命名
const { name: userName, age: userAge } = user;
console.log(userName, userAge); // Tom, 20

// 默认值
const { name, age, email = "no-email" } = user;
console.log(email); // no-email

// 嵌套解构
const user = {
  name: "Tom",
  address: {
    city: "Beijing",
    street: "Main St",
  },
};
const {
  address: { city },
} = user;
console.log(city); // Beijing

// 函数参数解构
function greet({ name, age }) {
  console.log(`Hello, ${name}, you are ${age}`);
}
greet({ name: "Tom", age: 20 });

4.3 解构赋值应用

常见应用场景

  • 函数参数:简化函数参数传递
  • 返回值:从函数返回多个值
  • 模块导入:从模块导入特定功能
  • 配置对象:处理配置对象

第五章:扩展运算符 - 展开与收集(实用工具)

5.1 扩展运算符基础

扩展运算符语法

  • 基本语法...array...obj
  • 数组展开:展开数组元素
  • 对象展开:展开对象属性
  • 函数参数:展开参数列表

扩展运算符示例

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
// 数组展开
const arr1 = [1, 2, 3];
const arr2 = [4, 5, 6];
const combined = [...arr1, ...arr2];
console.log(combined); // [1, 2, 3, 4, 5, 6]

// 对象展开
const obj1 = { a: 1, b: 2 };
const obj2 = { c: 3, d: 4 };
const merged = { ...obj1, ...obj2 };
console.log(merged); // { a: 1, b: 2, c: 3, d: 4 }

// 函数参数
const numbers = [1, 2, 3];
Math.max(...numbers); // 3

// 复制数组
const original = [1, 2, 3];
const copy = [...original];

// 复制对象
const originalObj = { a: 1, b: 2 };
const copyObj = { ...originalObj };

5.2 扩展运算符应用

常见应用场景

  • 数组合并:合并多个数组
  • 对象合并:合并多个对象
  • 数组复制:浅拷贝数组
  • 函数调用:展开参数列表
  • 解构赋值:收集剩余元素

第六章:模板字符串 - 字符串增强(实用特性)

6.1 模板字符串基础

模板字符串语法

  • 基本语法:使用反引号 ` 包裹字符串
  • 变量插值:使用 ${变量} 插入变量
  • 表达式:可以在 ${} 中使用表达式
  • 多行字符串:支持多行字符串,保留换行

模板字符串示例

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
// 基本用法
const name = "Tom";
const greeting = `Hello, ${name}`;
console.log(greeting); // Hello, Tom

// 表达式
const a = 10,
  b = 20;
const result = `Sum: ${a + b}`;
console.log(result); // Sum: 30

// 多行字符串
const multiLine = `
  Line 1
  Line 2
  Line 3
`;

// 函数调用
function formatName(first, last) {
  return `${first} ${last}`;
}
const fullName = formatName("Tom", "Smith");

// 嵌套模板字符串
const isActive = true;
const status = `User is ${isActive ? "active" : "inactive"}`;

6.2 标签模板

标签模板语法

  • 基本概念:在模板字符串前加函数名
  • 应用场景:字符串处理、国际化、样式处理
  • 参数接收:函数接收字符串数组和变量值

标签模板示例

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
// 基本标签模板
function tag(strings, ...values) {
  console.log(strings); // ['Hello, ', '!']
  console.log(values); // ['Tom']
  return strings[0] + values[0] + strings[1];
}

const name = "Tom";
const result = tag`Hello, ${name}!`;

// 实际应用:HTML 转义
function htmlEscape(strings, ...values) {
  return strings.reduce((result, str, i) => {
    const value = values[i]
      ? String(values[i])
          .replace(/&/g, "&amp;")
          .replace(/</g, "&lt;")
          .replace(/>/g, "&gt;")
      : "";
    return result + str + value;
  }, "");
}

const userInput = '<script>alert("xss")</script>';
const safe = htmlEscape`<div>${userInput}</div>`;

第七章:Promise - 异步编程基础(核心特性)

7.1 Promise 基础

Promise 概念

  • 异步编程:解决回调地狱问题
  • 三种状态:pending(进行中)、fulfilled(已成功)、rejected(已失败)
  • 状态不可逆:状态一旦改变就不会再变
  • 链式调用:支持链式调用,代码更清晰

Promise 基本用法

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
// 创建 Promise
const promise = new Promise((resolve, reject) => {
  // 异步操作
  setTimeout(() => {
    const success = true;
    if (success) {
      resolve("操作成功");
    } else {
      reject("操作失败");
    }
  }, 1000);
});

// 使用 Promise
promise
  .then((result) => {
    console.log(result); // 操作成功
  })
  .catch((error) => {
    console.error(error); // 操作失败
  });

// Promise 链式调用
fetch("/api/data")
  .then((response) => response.json())
  .then((data) => {
    console.log(data);
  })
  .catch((error) => {
    console.error(error);
  });

7.2 Promise 方法

Promise 静态方法

  • Promise.all():所有 Promise 都成功才成功
  • Promise.race():第一个完成的 Promise
  • Promise.allSettled():等待所有 Promise 完成
  • Promise.resolve():创建已成功的 Promise
  • Promise.reject():创建已失败的 Promise

Promise 方法示例

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
// Promise.all
const p1 = Promise.resolve(1);
const p2 = Promise.resolve(2);
const p3 = Promise.resolve(3);

Promise.all([p1, p2, p3]).then((values) => {
  console.log(values); // [1, 2, 3]
});

// Promise.race
Promise.race([p1, p2, p3]).then((value) => {
  console.log(value); // 1(第一个完成的)
});

// Promise.allSettled
Promise.allSettled([p1, p2, p3]).then((results) => {
  console.log(results);
  // [{status: 'fulfilled', value: 1}, ...]
});

第八章:async/await - 异步编程进阶(现代语法)

8.1 async/await 基础

async/await 语法

  • async 函数:声明异步函数,返回 Promise
  • await 关键字:等待 Promise 完成
  • 错误处理:使用 try/catch 处理错误
  • 同步写法:异步代码看起来像同步代码

async/await 示例

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// 基本用法
async function fetchData() {
  try {
    const response = await fetch("/api/data");
    const data = await response.json();
    return data;
  } catch (error) {
    console.error("Error:", error);
  }
}

// 多个异步操作
async function fetchMultiple() {
  const [user, posts] = await Promise.all([
    fetch("/api/user").then((r) => r.json()),
    fetch("/api/posts").then((r) => r.json()),
  ]);
  return { user, posts };
}

// 循环中的 await
async function processItems(items) {
  for (const item of items) {
    await processItem(item);
  }
}

8.2 async/await 最佳实践

实践建议

  • 错误处理:始终使用 try/catch
  • 并行执行:使用 Promise.all 并行执行
  • 避免过度使用:不是所有异步都需要 await
  • 性能优化:合理使用并行和串行

第九章:类与继承 - 面向对象编程(OOP 增强)

9.1 class 语法

class 基础

  • 类声明:使用 class 关键字声明类
  • 构造函数:constructor 方法
  • 方法定义:类中定义方法
  • 静态方法:使用 static 关键字

class 示例

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
// 基本类
class Person {
  constructor(name, age) {
    this.name = name;
    this.age = age;
  }

  greet() {
    return `Hello, I'm ${this.name}`;
  }

  static create(name, age) {
    return new Person(name, age);
  }
}

const person = new Person("Tom", 20);
console.log(person.greet()); // Hello, I'm Tom

// 继承
class Student extends Person {
  constructor(name, age, grade) {
    super(name, age);
    this.grade = grade;
  }

  study() {
    return `${this.name} is studying`;
  }
}

const student = new Student("Jerry", 18, "A");
console.log(student.greet()); // Hello, I'm Jerry
console.log(student.study()); // Jerry is studying

9.2 继承与多态

继承特性

  • extends 关键字:继承父类
  • super 关键字:调用父类构造函数和方法
  • 方法重写:子类可以重写父类方法
  • 多态:不同子类实现不同行为

第十章:模块化 - import 和 export(工程化基础)

10.1 模块导出

export 语法

  • 命名导出export const name = 'value'
  • 默认导出export default value
  • 混合导出:同时使用命名导出和默认导出

export 示例

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
// 命名导出
export const PI = 3.14159;
export function add(a, b) {
  return a + b;
}

// 默认导出
export default class Calculator {
  // ...
}

// 混合导出
export const version = '1.0.0';
export default function() {
  // ...
}

10.2 模块导入

import 语法

  • 命名导入import { name } from './module'
  • 默认导入import name from './module'
  • 全部导入import * as module from './module'
  • 重命名import { name as newName } from './module'

import 示例

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
// 命名导入
import { PI, add } from "./math";

// 默认导入
import Calculator from "./calculator";

// 全部导入
import * as math from "./math";
math.PI; // 3.14159

// 重命名
import { add as sum } from "./math";

// 混合导入
import Calculator, { version } from "./calculator";

第十一章:其他重要特性(进阶内容)

11.1 Symbol

Symbol 基础

  • 唯一标识符:每个 Symbol 都是唯一的
  • 私有属性:可以用作对象的私有属性
  • 内置 Symbol:JavaScript 内置的 Symbol 值

Symbol 示例

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
// 创建 Symbol
const sym1 = Symbol("description");
const sym2 = Symbol("description");
console.log(sym1 === sym2); // false

// 作为对象属性
const obj = {
  [Symbol("key")]: "value",
};

// 内置 Symbol
const arr = [1, 2, 3];
arr[Symbol.iterator]; // 迭代器

11.2 Set 和 Map

Set 集合

  • 唯一值集合:存储唯一值
  • 常用方法:add、delete、has、size
  • 应用场景:去重、集合运算

Map 映射

  • 键值对集合:键可以是任意类型
  • 常用方法:set、get、delete、has、size
  • 应用场景:对象映射、缓存

Set 和 Map 示例

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
// Set
const set = new Set([1, 2, 3, 3, 4]);
console.log(set.size); // 4
set.add(5);
set.has(3); // true

// Map
const map = new Map();
map.set("name", "Tom");
map.set(1, "one");
map.get("name"); // Tom
map.has(1); // true

11.3 迭代器与生成器

迭代器(Iterator)

  • 迭代协议:实现 Symbol.iterator 方法
  • for…of 循环:遍历可迭代对象
  • 内置迭代器:数组、字符串、Map、Set

生成器(Generator)

  • 生成器函数:使用 function* 声明
  • yield 关键字:暂停函数执行
  • 应用场景:异步迭代、惰性计算

迭代器和生成器示例

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
// 迭代器
const arr = [1, 2, 3];
for (const item of arr) {
  console.log(item);
}

// 生成器
function* numberGenerator() {
  yield 1;
  yield 2;
  yield 3;
}

const gen = numberGenerator();
console.log(gen.next().value); // 1
console.log(gen.next().value); // 2

第十二章:ES6 实战应用(项目实践)

12.1 常见应用场景

实际项目应用

  • API 调用:使用 async/await 处理异步请求
  • 数据处理:使用解构和扩展运算符处理数据
  • 模块化开发:使用 import/export 组织代码
  • 类与继承:使用 class 构建对象模型

12.2 最佳实践

编码规范

  • 优先使用 const:值不变使用 const
  • 使用箭头函数:简化函数写法
  • 使用模板字符串:替代字符串拼接
  • 使用解构赋值:简化数据提取
  • 使用 async/await:替代 Promise 链

12.3 兼容性处理

Babel 转译

  • Babel 配置:配置 Babel 转译 ES6
  • polyfill:使用 polyfill 补充缺失特性
  • 浏览器支持:了解浏览器兼容性

第十三章:学习资源推荐

13.1 官方文档

  • MDN Web Docs:ES6 完整文档
  • ECMAScript 规范:官方规范文档
  • Babel 文档:Babel 转译工具文档

13.2 在线教程

  • ES6 入门教程:阮一峰 ES6 教程
  • JavaScript.info:现代 JavaScript 教程
  • freeCodeCamp:免费编程课程

13.3 实践项目

  • Todo 应用:使用 ES6 特性构建
  • API 客户端:使用 async/await 调用 API
  • 模块化项目:使用 import/export 组织代码

结语:掌握 ES6,开启现代 JavaScript 开发

ES6 是现代 JavaScript 开发的基础,掌握 ES6 特性能够:

  1. 提高开发效率:简化代码,提高可读性
  2. 改善代码质量:更好的作用域、类型安全
  3. 支持现代开发:模块化、异步编程、面向对象
  4. 跟上技术趋势:ES6+ 是未来 JavaScript 的基础

记住,学习 ES6 不是一蹴而就的,需要:

  • 系统学习:按照本文顺序系统学习
  • 大量实践:通过项目实践巩固知识
  • 持续更新:关注 ES7、ES8 等新特性
  • 理解原理:理解特性背后的原理

愿每一位开发者都能掌握 ES6,用现代 JavaScript 写出更优雅的代码!

Licensed under CC BY-NC-SA 4.0
comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计