本文针对 JavaScript 新手系统讲解 ES6 核心语法,涵盖变量声明、箭头函数、解构赋值、类与继承、Promise 等核心模块。通过150 + 行带注释代码,结合「传统写法对比」和「新手避坑指南」,帮助读者 3 小时掌握 ES6 关键特性,快速应用于项目开发。
// var的变量提升与重复声明问题
console.log(num); // 输出undefined(变量提升)
var num = 10;
if (true) {
var name = '小明'; // 全局作用域
}
console.log(name); // 输出'小明'
特性 |
作用 |
示例代码 |
内存管理 |
let |
块级作用域变量 |
let age = 18; |
可重新赋值 |
const |
块级作用域常量 |
const PI = 3.14; |
不可重新赋值 |
// let的块级作用域示例
if (true) {
let msg = 'Hello ES6';
}
console.log(msg); // 报错:msg未定义
示意图:let 与 var 作用域对比
// 传统函数的this指向问题
const obj = {
name: '张三',
sayHi: function() {
setTimeout(function() {
console.log(this.name); // 输出undefined(this指向window)
}, 1000);
}
};
// 箭头函数自动绑定外层this
const obj = {
name: '张三',
sayHi: () => {
setTimeout(() => {
console.log(this.name); // 输出'张三'(this指向obj)
}, 1000);
}
};
语法糖对比表
场景 |
传统函数写法 |
箭头函数写法 |
简单函数 |
function(a,b){ return a+b; } |
(a,b) => a+b |
单参数函数 |
function(a){ return a*2; } |
a => a*2 |
无参数函数 |
function(){ return 'hi'; } |
() => 'hi' |
// 传统写法:手动赋值
const arr = [1, 2, 3];
const first = arr[0];
const second = arr[1];
// ES6解构写法
const [first, second] = arr; // first=1, second=2
const user = { id: 1, name: '李四' };
const { id, name } = user; // id=1, name='李四'
实战案例:解构函数参数
// 传统写法:对象属性访问
function renderUser(user) {
console.log(user.name, user.age);
}
// ES6解构写法
function renderUser({ name, age }) {
console.log(name, age); // 直接获取属性
}
renderUser({ name: '王五', age: 25 }); // 输出:王五 25
const name = '张三';
const age = 18;
console.log('姓名:' + name + ',年龄:' + age); // 繁琐易错
console.log(`姓名:${name},年龄:${age}`); // 输出:姓名:张三,年龄:18
高级用法:多行字符串与表达式
const html = `
${title}
内容:${content}
`;
// 构造函数
function Animal(name) {
this.name = name;
}
Animal.prototype.speak = function() {
console.log(`${this.name}叫`);
};
// 继承
function Dog(name) {
Animal.call(this, name);
}
Dog.prototype = Object.create(Animal.prototype);
// 定义类
class Animal {
constructor(name) {
this.name = name;
}
speak() {
console.log(`${this.name}叫`);
}
}
// 继承
class Dog extends Animal {
speak() {
super.speak(); // 调用父类方法
console.log('汪汪汪');
}
}
// 多层嵌套的回调函数
getData((data1) => {
processData(data1, (data2) => {
saveData(data2, (result) => {
console.log(result);
});
});
});
getData()
.then(processData)
.then(saveData)
.then((result) => console.log(result))
.catch((error) => console.error(error));
三、实战案例:用 ES6 重构传统代码
const users = [{ id: 1, name: '张三', age: 20 }, { id: 2, name: '李四', age: 17 }];
const filtered = users.filter(function(user) {
return user.age > 18;
});
const names = filtered.map(function(user) {
return user.name;
});
const names = users
.filter(user => user.age > 18)
.map(user => user.name);
const user1 = { name: '张三', age: 18 };
const user2 = { age: 20, gender: '男' };
const merged = Object.assign({}, user1, user2); // { name: '张三', age: 20, gender: '男' }
const merged = { ...user1, ...user2 }; // 等价于Object.assign
错误代码:
for (var i = 0; i < 5; i++) {
// ...
}
console.log(i); // 输出5(var的全局作用域)
正确写法:
for (let i = 0; i < 5; i++) {
// ...
}
console.log(i); // 报错(let的块级作用域)
错误场景:需要动态绑定 this 的构造函数中使用箭头函数
class Counter {
constructor() {
this.count = 0;
this.timer = setInterval(() => {
this.count++; // 正确:箭头函数继承外层this
}, 1000);
}
}
注意:箭头函数适合回调函数,不适合作为构造函数或需要动态 this 的场景
特性 |
传统语法 |
ES6 语法 |
适用场景 |
变量声明 |
var x = 1; |
let x = 1; const y = 2; |
块级作用域变量 / 常量 |
函数定义 |
function add() {} |
(a,b) => a+b |
简单函数、回调函数 |
字符串拼接 |
'a' + 'b' |
`a${b}` |
动态字符串、多行文本 |
数组解构 |
var a = arr[0]; |
const [a, b] = arr; |
快速提取数组元素 |
对象继承 |
原型链继承 |
class Child extends Parent |
面向对象编程 |
异步操作 |
回调函数嵌套 |
Promise.then() |
网络请求、定时任务 |