解构赋值(Destructuring assignment)是 JavaScript ES6 引入的一种语法特性,它使得我们可以从数组和对象中提取值,并以一种更便捷的方式赋值给变量。这种语法可以大大减少代码量,提高代码的可读性和维护性。
数组解构允许我们按照索引位置提取数组中的值。
// 基本用法
const [a, b, c] = [1, 2, 3];
console.log(a, b, c); // 1 2 3
// 解构部分值
const [x, , z] = [1, 2, 3]; // 跳过中间的元素
console.log(x, z); // 1 3
// 解构失败时的处理
const [a1, b1, c1] = [1, 2]; // c1 将是 undefined
console.log(a1, b1, c1); // 1 2 undefined
当解构的值为 undefined 时,默认值会生效。这在处理可能缺失的数据时非常有用。
// 设置默认值
const [a = 5, b = 7] = [1];
console.log(a, b); // 1 7 // b使用默认值7
// 默认值生效条件
const [x = 1] = [undefined]; // x = 1 // undefined触发默认值
const [y = 1] = [null]; // y = null // null不触发默认值
const [z = 1] = [0]; // z = 0 // 0不触发默认值
使用扩展运算符(…)可以捕获剩余的所有元素。这在处理不定长数组时特别有用。
// 使用扩展运算符
const [head, ...tail] = [1, 2, 3, 4];
console.log(head); // 1
console.log(tail); // [2, 3, 4]
// 实际应用:分割数组
const [first, second, ...rest] = [1, 2, 3, 4, 5];
console.log(first); // 1
console.log(second); // 2
console.log(rest); // [3, 4, 5]
// 注意:扩展运算符必须在最后使用
// 错误示例:const [...rest, last] = [1, 2, 3]; // SyntaxError
可以解构多层嵌套的数组,这在处理复杂数据结构时非常有用。
// 多维数组解构
const [[a, b], [c, d]] = [
[1, 2],
[3, 4],
];
console.log(a, b, c, d); // 1 2 3 4
// 更复杂的嵌套示例
const [a, [b, [c, d]]] = [1, [2, [3, 4]]];
console.log(a, b, c, d); // 1 2 3 4
// 结合默认值
const [[a1 = 0, b1 = 0] = [], [c1 = 0, d1 = 0] = []] = [[1], [2]];
console.log(a1, b1, c1, d1); // 1 0 2 0
对象解构允许我们通过属性名来提取值,这比数组解构更灵活。
// 基本用法
const person = {
name: "Alice", age: 20 };
const {
name, age } = person;
console.log(name, age); // 'Alice' 20
// 变量重命名 - 非常有用当属性名不适合作为变量名时
const {
name: userName, age