Javascript:ES6+概念详解
一. 基础概念
什么是ES6+?
ES6+(或 ES2015+)是 JavaScript 语言的现代版本,包含了从 2015 年 ES6(ECMAScript 2015)开始的一系列更新。这些更新引入了新的语法糖、内置对象和 API,显著提升了代码的可读性、简洁性和开发效率。
什么是ECMAScript ?
ECMAScript 是 JavaScript 的标准化规范(由 ECMA 国际组织制定),而 JavaScript 是该规范的具体实现。
版本历史:
- ES5(2009):引入
Object.keys
、Array.prototype.forEach
等。 - ES6(2015):重大更新,引入箭头函数、类、Promise 等。
- ES7(2016):
async/await
、指数运算符(**
)等。 - ES8(2017):
async/await
正式化、Object.values
等。 - ES9(2018):
Promise.finally
、扩展运算符支持对象等。 - ES10(2019):
Array.flat
、String.trimStart/End
等。 - ES11(2020):可选链(
?.
)、空值合并(??
)、Promise.allSettled
等。 - ES12+(2021+):持续更新中,如逻辑赋值运算符(
&&=
、||=
、??=
)等。
ES6+ 的核心目标
1. 简化语法:减少样板代码,如箭头函数、解构赋值。
2. 增强面向对象编程:引入 class
和 extends
关键字。
3. 改进异步编程:从回调地狱到 Promise,再到 async/await
。
4. 提升模块化能力:标准化 import/export
语法。
5. 修复语言缺陷:如 let/const
解决变量提升问题,箭头函数修复 this
指向问题。
ES6+ 的重要性
1. 代码质量提升:语法更简洁,减少错误,提高可维护性。
2. 现代框架依赖:React、Vue、Angular 等框架大量使用 ES6+ 特性。
3. 浏览器兼容性:主流浏览器(Chrome、Firefox、Safari、Edge)已全面支持。
4. Node.js 支持:服务器端开发(如 Express、NestJS)依赖 ES6+ 特性。
二. 核心特性
1. 块级作用域
let
和 const
let
:块级作用域的变量声明,允许变量重新赋值但不能重复声明。const
:声明常量,一旦赋值不可重新赋值,同样具有块级作用域。
{
let x = 10;
const y = 20;
// y = 30; // 错误:不能重新赋值常量
}
// console.log(x); // 错误:x 超出作用域
2. 箭头函数
更简洁的函数语法,并且不绑定自己的 this
,而是继承自父级作用域。
// 基本语法
const sum = (a, b) => a + b;
// 无参数
const greet = () => "Hello!";
// 单参数可省略括号
const double = num => num * 2;
// 多行代码需用花括号和 return
const multiply = (a, b) => {
const result = a * b;
return result;
};
// 不绑定 this
const person = {
name: "Alice",
greet: () => {
// 这里的 this 指向全局对象(如 window)
console.log(`Hello, ${this.name}`); // 错误:this.name 是 undefined
},
sayHi() {
// 传统方法中的 this 指向 person 对象
setTimeout(() => {
console.log(`Hi, ${this.name}`); // 正确:箭头函数继承 this
}, 1000);
}
};
3. 解构赋值
从数组或对象中提取值并赋值给变量。
数组解构:
const arr = [1, 2, 3];
const [a, b, c] = arr;
console.log(a, b, c); // 1 2 3
// 跳过元素
const [x, , z] = arr;
console.log(x, z); // 1 3
// 默认值
const [p = 10, q = 20] = [5];
console.log(p, q); // 5 20
对象解构:
const person = { name: "Bob", age: 30 };
const { name, age } = person;
console.log(name, age); // "Bob" 30
// 重命名变量
const { name: fullName, age: years } = person;
console.log(fullName, years); // "Bob" 30
// 默认值
const { city = "New York" } = person;
console.log(city); // "New York"
函数参数解构:
function printInfo({ name, age }) {
console.log(`${name} is ${age} years old.`);
}
printInfo(person); // "Bob is 30 years old."
4. 扩展运算符与剩余参数
扩展运算符
展开数组或对象。
数组扩展:
const arr1 = [1, 2];
const arr2 = [...arr1, 3, 4];
console.log(arr2); // [1, 2, 3, 4]
// 合并数组
const merged = [...arr1, ...arr2];
console.log(merged); // [1, 2, 1, 2, 3, 4]
// 复制数组(浅拷贝)
const copy = [...arr1];
对象扩展:
const obj1 = { a: 1, b: 2 };
const obj2 = { ...obj1, c: 3 };
console.log(obj2); // { a: 1, b: 2, c: 3 }
// 合并对象(后面的属性覆盖前面的)
const mergedObj = { ...obj1, b: 100, d: 4 };
console.log(mergedObj); // { a: 1, b: 100, d: 4 }
剩余参数
将多个参数收集为一个数组。
function sum(...numbers) {
return numbers.reduce((total, num) => total + num, 0);
}
console.log(sum(1, 2, 3)); // 6
console.log(sum(1, 2, 3, 4, 5)); // 15
// 解构时使用剩余参数
const [first, ...rest] = [1, 2, 3, 4];
console.log(first, rest); // 1 [2, 3, 4]