一、为什么需要 ES6?
在 2015 年之前,JavaScript 虽然简单灵活,但缺乏大型项目所需的工程化能力:
- 没有块级作用域(
var的变量提升问题) - 无法优雅声明多个变量
- 函数参数处理繁琐
- 字符串拼接丑陋且易错
ES6(即 ECMAScript 2015)的出现,标志着 JS 正式迈入“现代语言”行列。它不仅语法更优雅,还引入了模块化、类、Promise等企业级特性。
二、解构赋值:让数据提取变得像呼吸一样自然
1. 数组解构
一次性声明多个变量,告别重复 let:
js
编辑
// 传统写法
let a = 1, b = 2, c = 3;
// ES6 解构写法(推荐)
const [a, b, c] = [1, 2, 3];
console.log(a, b, c); // 1 2 3
✅ 嵌套数组解构
js
编辑
const arr = [1, [2, 3, [4], 5]];
const [x, [y, z, [w], v]] = arr;
console.log(x, y, z, w, v); // 1 2 3 4 5
✅ 剩余元素(Rest 运算符 ...)
js
编辑
const users = ['Jake', 'Tom', 'Lucy', 'Lili'];
const [captain, ...players] = users;
console.log(captain); // "Jake"
console.log(players); // ["Tom", "Lucy", "Lili"]
💡 注意:
...必须放在最后,否则会报错!
2. 对象解构
js
编辑
const obj = {
name: 'Wang',
age: 18,
sex: 'boy',
like: { n: '唱跳' }
};
// 解构 + 嵌套
const { name, age, like: { n } } = obj;
console.log(name, age, n); // "Wang" 18 "唱跳"
✅ 属性简写(Shorthand Property)
当变量名与属性名一致时,可简写:
js
编辑
const sex = 'boy';
const user = { name: 'Wang', sex }; // 等价于 { name: 'Wang', sex: sex }
三、模板字符串:告别 + 拼接地狱
js
编辑
const myname = 'Mine';
// 传统拼接(易错、难读)
console.log('hello, I am ' + myname);
// ES6 模板字符串(支持插值、多行)
console.log(`hello, I am ${myname}`);
console.log(`hello, I am ${myname.toUpperCase()}`); // 支持表达式!
// 多行文本
const html = `
<div>
<h1>Hello ${myname}</h1>
</div>
`;
✅ 优势:支持表达式、换行、嵌套,可读性极强。
四、for...of 循环:语义清晰的迭代方式
ES6 引入 for...of,专为可迭代对象(如数组、字符串、Set、Map)设计。
js
编辑
const str = 'hello';
for (const char of str) {
console.log(char); // h e l l o
}
🔍 多种 for 循环对比
| 循环类型 | 适用场景 | 是否支持 break/continue | 是否支持异步 |
|---|---|---|---|
for (let i=0...) | 精确控制索引、性能敏感 | ✅ | ✅ |
for...in | 遍历对象可枚举属性名(慎用于数组!) | ✅ | ✅ |
for...of | 遍历值(数组、字符串等) | ✅ | ✅ |
forEach | 函数式风格,简洁 | ❌(不能 break) | ❌(不能 await) |
⚠️ 重要提醒:
for...in遍历的是键(key) ,且会包含原型链属性(除非用hasOwnProperty过滤)。forEach无法中断循环,也不支持async/await中的同步等待。
✅ 推荐:日常遍历数组/字符串 → 优先使用 for...of。
五、函数默认参数:告别 || 陷阱
js
编辑
function add(x = 1, y = 1) {
return x + y;
}
console.log(add(3, 4)); // 7
console.log(add(3)); // 4(y 默认为 1)
console.log(add()); // 2
💡 对比旧写法:
js 编辑 function add(x, y) { x = x || 1; // ❌ 问题:当 x=0 时也会被替换! y = y || 1; }ES6 默认参数更安全、语义更清晰。
六、BigInt:突破 Number 精度限制
JavaScript 的 Number 类型基于 IEEE 754 双精度浮点数,最大安全整数为:
js
编辑
console.log(Number.MAX_SAFE_INTEGER); // 9007199254740991 (≈ 2^53 - 1)
超过此值将丢失精度:
js
编辑
console.log(9007199254740992 === 9007199254740993); // true ❌
✅ 使用 BigInt(ES2020)
js
编辑
const bigNum = 9007199254740992n; // 注意末尾的 n
console.log(typeof bigNum); // "bigint"
// 支持基本运算
console.log(2n ** 100n); // 超大指数计算无压力
⚠️ 注意:
BigInt与Number不能直接混合运算(会报错)- 不支持
Math对象方法(如Math.sqrt)
七、指数运算符 **(ES2016)
替代 Math.pow(),更直观:
js
编辑
console.log(2 ** 10); // 1024
console.log(3 ** 3); // 27
✅ 代码更简洁,可读性更强。
八、总结要点
| 特性 | 核心价值 | 推荐使用场景 |
|---|---|---|
| 解构赋值 | 快速提取数据,减少冗余代码 | API 返回处理、函数参数解包 |
| 模板字符串 | 安全、可读的字符串拼接 | 动态 HTML、日志输出 |
for...of | 语义清晰,支持 break/continue | 遍历数组、字符串、Set/Map |
| 默认参数 | 避免 ` | |
| BigInt | 支持任意精度整数运算 | 区块链、金融计算 |
** 指数运算符 | 替代 Math.pow,更简洁 | 数学计算、算法实现 |
九、拓展思考
- 解构 + 默认值:
const { name = '匿名' } = user; - 解构别名:
const { name: username } = user; - 模板字符串标签函数:可用于防 XSS、国际化等高级场景。
- BigInt 与 JSON:
JSON.stringify不支持 BigInt,需自定义 replacer。
十、结语
ES6+ 不只是“语法糖”,而是工程化开发的基石。掌握这些特性,不仅能写出更优雅的代码,还能避免许多历史遗留陷阱