六维教程

ES6 解构赋值

解构赋值是 ES6 里最能”提升幸福感”的语法之一,从数组或对象里取数据,过去要一行行写变量,现在一条语句就能同时取出多个。

Vue、React 代码里几乎天天出现,这篇讲透数组解构、对象解构、嵌套解构和默认值。

数组解构

基本用法

位置依次取出:

// ES5:一个一个取
const arr = [10, 20];
const a = arr[0];
const b = arr[1];

// ES6:一行取出
const [a, b] = [10, 20];
console.log(a, b); // 10 20

跳过、取后几位、剩余

// 示例
const [x, , z] = [1, 2, 3];       // 空位跳过第 2 个
console.log(x, z);                // 1 3

const [, second] = [1, 2];        // 只取第 2 位
console.log(second);              // 2

// 结合 rest 参数(函数扩展篇讲过它的"收集"用法)
const [head, ...rest] = [1, 2, 3, 4];
console.log(head);    // 1
console.log(rest);    // [2, 3, 4]

交换两个变量的值

// 示例:不用临时变量,直接交换
let a = 1, b = 2;
[a, b] = [b, a];
console.log(a, b); // 2 1

默认值

下标对应位置不存在或为 undefined 时生效:

// 示例
const [x = 1, y = 2] = [];
console.log(x, y);   // 1 2

const [m = 5, n] = [undefined, 8];
console.log(m, n);   // 5 8

对象解构

按属性名取

对象解构不是按顺序,而是按属性名匹配:

// ES5
const user = { name: '小明', age: 20 };
const name = user.name;
const age = user.age;

// ES6:按属性名取
const { name, age } = user;

注意:名称必须和属性名一致。想换个变量名,用 属性名: 新名字

// 示例
const { name: n, age: a } = { name: '小明', age: 20 };
console.log(n); // 小明
console.log(a); // 20

嵌套对象解构

层层解构,直接取深层数据:

// 示例
const data = {
  user: { name: '小明', info: { city: '北京' } },
};
const { user: { name, info: { city } } } = data;
console.log(name); // 小明
console.log(city); // 北京

默认值

属性不存在或值为 undefined 时生效:

// 示例
const { title = '默认标题', likes = 0 } = { title: '你好' };
console.log(title); // 你好
console.log(likes); // 0

函数参数解构

解构最常用于函数参数——传给函数时直接拆开:

// 例:参数是一个对象,函数体里直接用属性名
function greeting({ name, age }) {
  console.log(`${name} 今年 ${age} 岁`);
}
greeting({ name: '小明', age: 20 });  // 小明 今年 20 岁

给参数默认值 + 解构默认值,可以更稳健:

// 示例
function config({ host = 'localhost', port = 8080 } = {}) {
  console.log(host, port);
}
config();                        // localhost 8080
config({ host: 'a.com', port: 3000 }); // a.com 3000

解构的常见用途

场景 用法
交换变量 [a, b] = [b, a]
函数参数取值 function f({name}) {}
取嵌套数据 const { a: { b } } = obj
配默认值 const { x = 1 } = obj
类库导入 import { ref } from 'vue'
上一篇
ES6 数组扩展
下一篇
ES6 运算符扩展