一、基本用法

ES6 允许按照一定模式,从数组和对象中提取值,对变量进行赋值,这被称为解构(Destructuring)。在此之前,变量赋值,只能直接指定值。

  1. let a = 1;
  2. let b = 2;
  3. console.log(a,b);// 1,2

而如今采用ES6语法,可以这样写:

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


也可以使用嵌套数组进行解构:

  1. let a,b,rest;
  2. [a,b,...rest]=[1,2,3,4,5,6];
  3. console.log(a,b,rest);//1 2 [3,4,5,6]
  4. let [a, [[b], c]] = [1, [[2], 3]];
  5. console.log(a,b,c);// 1 2 3


解构不仅可以用于数组,还可以用于对象。接下来我们对比下这两种写法,感受下ES6带来的便利。

  1. var expense={ type:"es6", amount:"45"};
  2. var type=expense.type//ES5写法
  3. var amount=expense.amount;//ES5写法
  4. console.log(type,amount);

如果使用ES6一句话就可以实现了:

  1. const { type,amount}=expense//ES6写法

我们再举个对象结构的例子:

  1. let a,b;
  2. ({a,b}={a:1,b:2})
  3. console.log(a,b);// 1,2
  4. let {a=10,b=5}={a:3};
  5. console.log(a,b);// 3 5


对象的解构与数组有一个重要的不同。数组的元素是按次序排列的,变量的取值由它的位置决定;而对象的属性没有次序,变量必须与属性同名,才能取到正确的值。上面例子等价于let { a: a, b: b } = { a: 1, b: 2 };
与数组一样,解构也可以用于嵌套结构的对象。

  1. let metaData={
  2. title:'abc',
  3. test:[{
  4. title:'test',
  5. desc:'description'
  6. }]
  7. }
  8. let {title:esTitle,test:[{title:cnTitle}]}=metaData;
  9. console.log(esTitle,cnTitle);// abc test

二、应用场景

1️⃣:变量之间交换

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

交换变量a和b的值,常规做法是要通过一个定义中间变量来完成,而通过解构赋值的写法不仅简洁,而且易读,语义非常清晰。

2️⃣从函数返回多个值

函数只能返回一个值,如果要返回多个值,只能将它们放在数组或对象里返回。有了解构赋值,取出这些值就非常方便。

  1. function f(){
  2. return [1,2]
  3. }
  4. let a,b;
  5. [a,b]=f();
  6. console.log(a,b);// 1 ,2

变形一:

  1. function f(){
  2. return [1,2,3,4,5]
  3. }
  4. let a,b;
  5. [a,,,b]=f();
  6. console.log(a,b);// 1 4

变形二:

  1. function f(){
  2. return [1,2,3,4,5]
  3. }
  4. let a,b,c;
  5. [a,,...b]=f();
  6. console.log(a,b);//1 [3,4,5]

3️⃣提取 JSON 数据
解构赋值对提取 JSON 对象中的数据,尤其有用。

  1. let jsonData = {
  2. id: 42,
  3. status: "OK",
  4. data: [867, 5309]
  5. };
  6. let { id, status, data: number } = jsonData;
  7. console.log(id, status, number);//42, "OK", [867, 5309]