网站

解构赋值 | MDN

ES6 解构赋值 | 阮一峰

引入

从数组或对象里取值赋给变量,是很常见的操作。以前只能一个一个取,如果字段多就很啰嗦。

解构赋值让你可以用一行代码把数组或对象里的值”拆”出来,直接赋给变量。

正文

定义

解构赋值是按照数组或对象的结构,把里面的值拆出来赋给对应的变量。

数组解构

按位置取值,变量名随意,顺序对应即可。

const arr = [1, 2, 3];
 
const [a, b, c] = arr;
 
console.log(a);
console.log(b);
console.log(c);

可以跳过某些位置:

const [first, , third] = [1, 2, 3];
 
console.log(first);
console.log(third);

对象解构

按属性名取值,变量名要和属性名一致。

const user = {
  name: "Tom",
  age: 18,
  city: "北京"
};
 
const { name, age, city } = user;
 
console.log(name);
console.log(age);

重命名

如果不想用属性名作为变量名,可以用 : 指定新名字。

const user = {
  name: "Tom",
  age: 18
};
 
const { name: userName, age: userAge } = user;
 
console.log(userName);
console.log(userAge);

默认值

当解构的值是 undefined 时,会使用默认值。

const [a = 0, b = 0, c = 0] = [1, 2];
 
console.log(a);
console.log(b);
console.log(c);

对象解构也支持默认值:

const { name = "匿名", age = 0 } = {};
 
console.log(name);
console.log(age);

嵌套解构

数组或对象里嵌套了其他结构,也可以一层层解出来。

const data = {
  user: {
    name: "Tom",
    address: {
      city: "北京"
    }
  }
};
 
const { user: { name, address: { city } } } = data;
 
console.log(name);
console.log(city);

嵌套数组解构:

const matrix = [
  [1, 2],
  [3, 4]
];
 
const [[a, b], [c, d]] = matrix;
 
console.log(a);
console.log(d);

剩余模式(Rest)

把剩余的元素收集到一个数组里。

const [first, ...rest] = [1, 2, 3, 4, 5];
 
console.log(first);
console.log(rest);

对象也可以:

const { name, ...others } = {
  name: "Tom",
  age: 18,
  city: "北京"
};
 
console.log(name);
console.log(others);

函数参数解构

函数的参数也可以解构,特别适合接收配置对象。

function printUser({ name, age }) {
  console.log(`名字:${name},年龄:${age}`);
}
 
printUser({ name: "Tom", age: 18 });

带默认值的参数解构:

function createUser({ name = "匿名", age = 0 } = {}) {
  console.log(name);
  console.log(age);
}
 
createUser();
createUser({ name: "Tom" });

变量交换

解构赋值可以直接交换两个变量的值,不需要临时变量。

let a = 1;
let b = 2;
 
[a, b] = [b, a];
 
console.log(a);
console.log(b);

常见写法

写法说明
const [a, b] = [1, 2]数组解构,按位置取值
const { name, age } = user对象解构,按属性名取值
const { name: userName } = user解构并重命名
const [a = 0] = []带默认值的解构
const [first, …rest] = arr剩余模式,收集后面的元素
function fn({ name, age })函数参数解构

例子

从 API 返回数据中提取字段

const response = {
  status: 200,
  data: {
    users: [
      { id: 1, name: "Tom" },
      { id: 2, name: "Jack" }
    ],
    total: 2
  }
};
 
const { data: { users, total } } = response;
 
console.log(users);
console.log(total);

函数返回多个值

function getUserInfo() {
  return {
    name: "Tom",
    age: 18,
    city: "北京"
  };
}
 
const { name, city } = getUserInfo();
 
console.log(name);
console.log(city);

理解

可以把解构赋值理解为拆快递

数组解构是按位置拆,第一个给第一个变量,第二个给第二个变量。对象解构是按名字拆,属性叫什么,就找什么。

默认值就像快递里没放东西时,你自己准备好的替代品。剩余模式就是把剩下的全放进一个大袋子里。

解构赋值的核心好处是少写重复代码,让取值这一步更直观。

引出

解构赋值经常和 JS 展开语法 一起出现,展开语法是把数据”铺开”,解构是把数据”拆出来”,方向刚好相反。

解构赋值在 JS 变量 声明和 JS 函数 参数中都会用到。