ES6(三)解构赋值

187 阅读4分钟

这是ES6提供的一种更简洁的赋值模式。解构:从数组和对象中提取值。

在ES5中我们想要把一个数组中的值分别赋给几个变量:

let a=10
let b=20
let arr=[1,2,3,4,5]
a=arr[0]
b=arr[1]
let arr1=arr.slice(2)   //取arr[2]到arr[arr.length-1]为一个新数组
console.log(a,b,arr1) //1  2   [3,4,5]

上面这种操作比较麻烦,用解构赋值可以很快实现这个操作:

let [a,b,...arr1]=arr

数组解构

1.先声明,再分别赋值

不能在声明的同时赋值,let [a,b]是不合法的。

let a, b;         // 先声明变量
[a, b] = [1, 2];  // 然后分别赋值
console.log(a);   // 1
console.log(b);   // 2

2.解构前设置默认值

b解构取出的值是 undefined,但是可以提前设置默认值:

let a, b;
let arr=[1]
[a = 5, b = 7] = arr;   //a===1  b===7let arr2=[1,null]
[a = 5, b = 7] = arr2;   //a===1  b===null

b的值是undefined,因此还显示默认值,但如果b是null,则仍显示null

3.变量交换

之前的做法:提供一个缓存变量temp

let a = 1,b = 3;
let temp=a;
a=b;
b=temp;

ES6里交换,非常方便

[a, b] = [b, a];
[a,b,c,d]=[d,c,b,a];

4.解构 函数返回的数组

调用函数,返回一个数组,可以用解构形式的变量来接收

function c() {
  return [10, 20];
}
​
let a, b;
[a, b] = c();  //a===10     b===20

5.跳过某一项返回值

你也可以跳过一些没有用的返回值。举例:

function c() {
  return [1, 2, 3];
}
let [a, ,b] = c();  //a===1  b===3

6.单取某一个值

const array=[1,2,3,4,5]
let [,,,num,]=array  //num===4

7.reset :... 剩余值

...变量是剩余值的省略表示作为一个数组赋值给变量

let [a,b,...c]=[1,2,3,4,5]
console.log(a,b,c) //1  2   [3,4,5]
console.log(c)     //[3,4,5]  c是一个数组

`...数组会把数组这些值拆开成一个个的变量

console.log(...c)  //3 4 5   
console.log(c[0],c[1],c[2])  //3 4 5

...必须放在最后一项,表示剩余项

let [a, ...b] = [1,2,3]; //a===1 b===[2,3]
let [a,...b,c]= [1,2,3]; //不合法

8.嵌套数组的解构

const arr = ['hello', [1,2,3], 'goodbye'];
const [string,[one,two,three]] = arr;
console.log(string,one,two,three); // hello 1 2 3

对象解构

1.let声明符 解构

let x = { 
  y: 22,
  z: true 
}; 
let { y, z } = x; // y===22   z==='true'

2.无声明符 解构

({ y, z } = { y: 1, z: 2 });  //圆括号 (...) 不能省略

3.解构对象时,赋以新的变量名

获取对象x的属性名y,然后赋值给一个名称为y1的变量。

let x = { y: 22, z: true };
let { y: y1, z: z1 } = o;  
//y1===22   z1===true

4.解构前设置默认值

如果解构取出的对象值是 undefined ,也可以使用设置的默认值

let { a = 10, b = 5 } = { a: 3 };     //a===3   b===5

3+4.赋值给新变量名的同时提供默认值

let { a: aa = 10, b: bb = 5 } = { a: 3 };  //aa===3  bb===5

5.同时使用数组和对象解构

在解构中数组和对象可以联合使用:

const props = [
  { id: 1, name: 'Fizz' },
  { id: 2, name: 'Buzz' },
  { id: 3, name: 'FizzBuzz' },
];
const [, , { name }] = props;   //name==="FizzBuzz"

6.以对象形式解构数组

对象的key就是数组的索引下标

let arr=[1,2,3,4,5]
let {0:first,[arr.length-1]:last}=[1,2,3,4,5]  //first===1    last===5

函数参数的解构赋值

1.函数传参

//数组传参:参数是一组有次序的值
function f1([x, y, z]) { return x+y+z}
f1([1, 2, 3]);  //调用传参//对象传参:参数是一组无次序的值  形参和实参名需对应
function f({x, y, z}) { return x }
f({z: 3, y: 2, x: 1});  //1

函数f1的参数表面上是一个数组,但在传入参数的那一刻,数组参数就被解构成变量xy z。在函数内部没有数组,只有变量xy z

2.从函数返回多个值

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

// 返回一个数组
function example() {
  return [1, 2, 3];
}
let [a, b, c] = example();
​
// 返回一个对象
function example() {
  return {
    foo: 1,
    bar: 2
  };
}
let { foo, bar } = example();

总结

解构赋值,主要分为三种:

  • 数组
[x,y]=[1,2]
[x,y,...z]=[1,2,3,4,5]
[x,y]=[1]     //x===1  y===undefined
[x,y=10]=[1]  //x===1  y===10
  • 对象:要么let,要么()
let {a,b } = {a:1,b:2};
({a,b} = {a:1,b:2});
​
({a:A,b:B} = {a:1,b:2});   //A===1  B===2  重命名let {a=10,b=20}={a:1}      //a===1  b===20  给默认值
let {a:A=10,b:B=20}={a:1}  //A===1  B===20
let {0:first,[arr.length-1]:last}=[1,2,3,4,5]  //first===1   last===5
  • 函数参数
function fn({oldname:newname="默认名"}={})   //有新的变量名和默认值
function fn([a,b,...c]){  }
​
function fn(){
  let a=10
  let b=20
  return {a,b}
}
let [a,b]=fn() //调用函数