目录
[1. 传统var的缺陷](#1. 传统var的缺陷)
[2. ES6解决方案](#2. ES6解决方案)
[1. 传统函数的痛点](#1. 传统函数的痛点)
[2. 箭头函数的优势](#2. 箭头函数的优势)
[1. 传统拼接方式](#1. 传统拼接方式)
[2. 模板字符串方案](#2. 模板字符串方案)
[1. 对象解构](#1. 对象解构)
[2. 数组解构](#2. 数组解构)
[1. 数组操作](#1. 数组操作)
[2. 对象操作](#2. 对象操作)
[1. 回调地狱问题](#1. 回调地狱问题)
[2. Promise解决方案](#2. Promise解决方案)
[3. 终极方案:async/await](#3. 终极方案:async/await)
[1. 导出模块](#1. 导出模块)
[2. 导入模块](#2. 导入模块)
[1. Class类语法](#1. Class类语法)
[2. Map/Set数据结构](#2. Map/Set数据结构)
[3. Symbol唯一值](#3. Symbol唯一值)
ECMAScript 2015(ES6)是JavaScript语言发展的里程碑式版本,它带来了革命性的语法改进 和强大的新特性 。本文将通过对比传统写法 与企业级最佳实践,系统解析ES6的核心特性,助您写出更现代、更高效的JavaScript代码。
一、变量声明:从var到let/const
1. 传统var的缺陷
javascript
// 变量提升与作用域问题
function checkVar() {
console.log(name); // undefined
if (true) {
var name = 'Alice';
}
console.log(name); // 'Alice'
}
2. ES6解决方案
javascript
// 块级作用域
function checkLet() {
let name = 'Bob';
if (true) {
let name = 'Alice'; // 独立作用域
console.log(name); // 'Alice'
}
console.log(name); // 'Bob'
}
// 常量声明
const PI = 3.1415;
PI = 3; // TypeError: Assignment to constant variable
最佳实践:
-
默认使用
const
-
需要重新赋值时使用
let
-
禁用
var
二、箭头函数:更简洁的this绑定
1. 传统函数的痛点
javascript
const obj = {
value: 42,
getValue: function() {
setTimeout(function() {
console.log(this.value); // undefined(this指向window)
}, 100);
}
};
2. 箭头函数的优势
javascript
const obj = {
value: 42,
getValue: function() {
setTimeout(() => {
console.log(this.value); // 42(继承外层this)
}, 100);
}
};
特性对比:
特性 | 传统函数 | 箭头函数 |
---|---|---|
this绑定 | 动态绑定 | 词法绑定 |
arguments对象 | 支持 | 不支持 |
构造函数 | 可实例化 | 不可实例化 |
隐式返回值 | 需return | 单行自动返回 |
三、模板字符串:告别字符串拼接
1. 传统拼接方式
javascript
const user = { name: 'Alice', age: 28 };
const str = '姓名:' + user.name + ',年龄:' + user.age;
2. 模板字符串方案
javascript
const str = `姓名:${user.name},年龄:${user.age}`;
// 高级用法:嵌套模板
const html = `
<div class="card">
<h2>${user.name}</h2>
<p>注册时间:${new Date().toLocaleDateString()}</p>
</div>
`;
四、解构赋值:优雅的数据提取
1. 对象解构
javascript
const user = {
id: 1,
info: {
name: 'Alice',
address: { city: 'Beijing' }
}
};
const { id, info: { name, address: { city } } } = user;
console.log(id, name, city); // 1 'Alice' 'Beijing'
2. 数组解构
javascript
// 基础解构
const [first, second] = [10, 20];
// 交换变量
let a = 1, b = 2;
[a, b] = [b, a];
// 嵌套解构
const [x, [y, z]] = [1, [2, 3]];
五、扩展运算符:高效的数据操作
1. 数组操作
javascript
// 合并数组
const arr1 = [1, 2];
const arr2 = [...arr1, 3, 4]; // [1,2,3,4]
// 替代apply
Math.max(...[3, 1, 4]); // 4
2. 对象操作
javascript
// 合并对象
const defaults = { color: 'red', size: 'md' };
const config = { ...defaults, size: 'lg' };
// 浅拷贝
const copy = { ...original };
六、Promise:异步编程的革命
1. 回调地狱问题
javascript
getUser(userId, function(user) {
getOrders(user.id, function(orders) {
getDetails(orders[0].id, function(details) {
// 嵌套层级持续加深...
});
});
});
2. Promise解决方案
javascript
getUser(userId)
.then(user => getOrders(user.id))
.then(orders => getDetails(orders[0].id))
.then(details => {
// 处理最终结果
})
.catch(error => {
// 统一错误处理
});
3. 终极方案:async/await
javascript
async function loadData() {
try {
const user = await getUser(userId);
const orders = await getOrders(user.id);
return await getDetails(orders[0].id);
} catch (error) {
console.error('加载失败', error);
}
}
七、模块化:工程化开发的基石
1. 导出模块
javascript
// math.js
export const PI = 3.1415926;
export function sum(a, b) {
return a + b;
}
export default class Calculator {
// ...
}
2. 导入模块
javascript
import Calculator, { PI, sum } from './math.js';
console.log(sum(PI, 10)); // 13.1415926
new Calculator();
八、其他重要特性速览
1. Class类语法
javascript
class Animal {
constructor(name) {
this.name = name;
}
speak() {
console.log(`${this.name} makes a noise`);
}
}
class Dog extends Animal {
speak() {
super.speak();
console.log(`${this.name} barks`);
}
}
2. Map/Set数据结构
javascript
const map = new Map();
map.set('key', 'value');
const set = new Set([1, 2, 3]);
set.add(4);
3. Symbol唯一值
javascript
const id = Symbol('userID');
const user = {
[id]: '123'
};
九、企业级最佳实践
-
代码规范:
javascript// .eslintrc { "rules": { "prefer-const": "error", "no-var": "error", "arrow-parens": ["error", "always"] } }
-
兼容性处理:
bashnpm install @babel/core @babel/preset-env --save-dev
-
性能优化:
javascript// 使用WeakMap处理内存敏感数据 const privateData = new WeakMap(); class MyClass { constructor() { privateData.set(this, { secret: 42 }); } }
延伸学习: