JavaScript ES6+ 新特性学习笔记
ES6 (ES2015) 主要特性
1. let 和 const
javascript
// let - 块作用域变量
if (true) {
let x = 1;
console.log(x); // 1
}
// console.log(x); // ReferenceError
// const - 块作用域常量
const PI = 3.14159;
// PI = 3.14; // TypeError: Assignment to constant variable
// const 对象可以修改属性
const obj = { name: "JavaScript" };
obj.name = "ES6"; // 允许
// obj = {}; // 不允许2. 箭头函数
javascript
// 传统函数
function add(a, b) {
return a + b;
}
// 箭头函数
const add = (a, b) => {
return a + b;
};
// 简化写法
const add = (a, b) => a + b;
// 单个参数可以省略括号
const square = x => x * x;
// 无参数
const greet = () => "Hello";
// 箭头函数的 this 绑定
const obj = {
name: "JavaScript",
traditional: function() {
console.log(this.name); // "JavaScript"
},
arrow: () => {
console.log(this.name); // undefined (this 指向外层作用域)
}
};TIP
箭头函数没有自己的 this,它会继承外层作用域的 this。
3. 模板字符串
javascript
const name = "JavaScript";
const version = "ES6";
// 传统字符串拼接
const message1 = "欢迎学习 " + name + " " + version;
// 模板字符串
const message2 = `欢迎学习 ${name} ${version}`;
// 多行字符串
const multiLine = `
第一行
第二行
第三行
`;
// 表达式计算
const a = 10;
const b = 20;
const result = `a + b = ${a + b}`; // "a + b = 30"4. 解构赋值
数组解构
javascript
// 基本解构
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]对象解构
javascript
const person = {
name: "JavaScript",
age: 25,
city: "Web"
};
// 基本解构
const { name, age } = person;
console.log(name, age); // "JavaScript", 25
// 重命名
const { name: personName, age: personAge } = person;
console.log(personName, personAge); // "JavaScript", 25
// 默认值
const { name, age, country = "China" } = person;
console.log(country); // "China"
// 嵌套解构
const user = {
name: "John",
address: {
city: "Beijing",
zip: "100000"
}
};
const { address: { city } } = user;
console.log(city); // "Beijing"5. 扩展运算符(Spread Operator)
javascript
// 数组扩展
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 }
// 函数参数
function sum(...numbers) {
return numbers.reduce((total, num) => total + num, 0);
}
console.log(sum(1, 2, 3, 4)); // 106. 类(Class)
javascript
// ES6 类语法
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("JavaScript", 25);
console.log(person.greet()); // "Hello, I'm JavaScript"
// 继承
class Developer extends Person {
constructor(name, age, language) {
super(name, age);
this.language = language;
}
code() {
return `${this.name} codes in ${this.language}`;
}
}
const dev = new Developer("John", 30, "JavaScript");
console.log(dev.greet()); // "Hello, I'm John"
console.log(dev.code()); // "John codes in JavaScript"7. 模块化(Modules)
javascript
// math.js
export const PI = 3.14159;
export function add(a, b) {
return a + b;
}
export default function multiply(a, b) {
return a * b;
}
// main.js
import multiply, { PI, add } from './math.js';
console.log(PI); // 3.14159
console.log(add(1, 2)); // 3
console.log(multiply(2, 3)); // 68. Promise
javascript
// Promise 基本用法
const promise = new Promise((resolve, reject) => {
setTimeout(() => {
resolve("成功");
}, 1000);
});
promise.then(result => {
console.log(result); // "成功"
});ES2017+ 新特性
async/await
javascript
async function fetchData() {
try {
const response = await fetch('https://api.example.com/data');
const data = await response.json();
return data;
} catch (error) {
console.error(error);
}
}对象方法简写
javascript
const obj = {
// ES6 之前
name: "JavaScript",
greet: function() {
return "Hello";
},
// ES6 简写
greet() {
return "Hello";
}
};可选链操作符(ES2020)
javascript
const user = {
name: "John",
address: {
city: "Beijing"
}
};
// 传统方式
const city = user && user.address && user.address.city;
// 可选链
const city = user?.address?.city;
// 方法调用
const result = user?.getName?.();空值合并操作符(ES2020)
javascript
// 传统方式
const value = user.name || "默认值";
// 空值合并(只对 null 和 undefined 生效)
const value = user.name ?? "默认值";
console.log(0 ?? "默认值"); // 0
console.log(null ?? "默认值"); // "默认值"
console.log(undefined ?? "默认值"); // "默认值"数组方法增强
javascript
// Array.find()
const arr = [1, 2, 3, 4, 5];
const found = arr.find(item => item > 3);
console.log(found); // 4
// Array.findIndex()
const index = arr.findIndex(item => item > 3);
console.log(index); // 3
// Array.includes()
console.log(arr.includes(3)); // true
// Array.flat() (ES2019)
const nested = [1, [2, 3], [4, [5, 6]]];
console.log(nested.flat()); // [1, 2, 3, 4, [5, 6]]
console.log(nested.flat(2)); // [1, 2, 3, 4, 5, 6]总结
ES6+ 为 JavaScript 带来了许多现代化特性,让代码更加简洁、易读、易维护。主要特性包括:
let和const- 更好的变量声明- 箭头函数 - 简洁的函数语法
- 模板字符串 - 更好的字符串处理
- 解构赋值 - 便捷的数据提取
- 扩展运算符 - 灵活的数组和对象操作
- 类语法 - 面向对象编程
- 模块化 - 代码组织和管理
- Promise 和 async/await - 异步编程