解构赋值是对赋值运算符的扩展

它是一种针对数组或对象进行模式匹配,然后对其中的变量进行赋值

在代码书写航简洁且易读,语义更加清晰明了,也方便了复杂对象中数据字段获取

在结构中,有下面两部分参与:

解构的源:解构赋值表达式的右边部分

解构的目标:解构赋值表达式的左边部分

一.  对数组的解构

1.数组解构下等号右边的值必须是可以遍历的

2. ...解构的时候,只能卸载尾部,不能写在中间

3. 解构赋值的默认值,只有对应的位置为undefined,才可以用默认值

例子1:

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

例子2:可嵌套

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

例子3:可忽略

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

例子4:不完全解构

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

 例子5:剩余运算符

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

例子6:结构字符串

let [a,...b] = 'hello';
console.log(a,b);//a='h',b=['e','l','l','o'];

例子7:解构默认值

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

注意:当解构模式有匹配结果,且匹配结果是undefined时,会触发默认值作为返回结果;

二.对对象解构

1.{}(字面量)是不可以遍历的

2.object结构重命名

例子1:基础

let {foo,bar} = {foo:'aaa',bar:'bbb'};
consolel.log(foo,bar);//foo='aaa',bar='bbb'
let {ba2:foo} = {ba2:'ddd'}
console.log(foo);//'ddd'

例子2:解构重命名

let {x:str,y:num} = {y:'123',x:'abc'};
console.log(str,num);//atr='abc',num='123'

例子3:默认值会被覆盖

let {y:str,x:num,z=100} = {x:'123',y:'abc',z:22};
console.log(z);//22

例子4:不完全解构

let obj = {p:[{y:'world'}]};
let {p:[{y},x]} = obj;
console.log(x,y);//x=undefined,y='world'

例子5:

let {a,b,...rest} = {a:10,b:20,c:30,d:40}
console.log(a,b,rest);//a=10,b=20,rest={c:30,d:40}

三. 数组也是一种对象

例子1:根据索引取数组

let arr = [1,2,3];
let {0:first,[arr.length-1]:last} = arr;
console.log(first,last);//first=1,last=3

错误写法:

let x;
{x} = {x:1};//js会认为是代码块,索引会报错
({x}={x:1})//加上小括号执行

四. 字符串解构

例子1:

const [a,b,c,d,e] = 'hello';

console.log(a,b,c,d,e);//a='h',b='e',c='l',d='l',e='o'

例子2:

const {length} = 'hello';//length= 5;

例子3:

let {toString:s} = 123;//数字上的toString()方法重命名
console.log(s);//'123'

例子4:

let {random,sin,cos} = Math;
console.log(random());//0.8051133247020075

例子5:

let {log} = console
log('aa');

五. 函数也可以用解构去写

例子1:

//老写法
function fn(person){
     let name = person.name;
     let age = person.age;
     console.log(person.name,person.age);
}
fn({name:'张三',age:15});//'张三',15
//新写法
function fn(name,age){
    console.log(name,age);  
}
fn({name:'张三',age:18});

例子2:默认参数通常应该在最后

function fn(a=1,b,c=3){//不报错,但是不好
   console.log(a,b,c);
}
function fn1(a,b=2,c=3){//不报错,但是不好
  console.log(a,b,c);
}
let [,a] = [1,2];//这种形式数组不报错
fn(,30);//报错,和解构数组不一样
//...rest运算符放在函数内取剩余参数,只能用在最后一个位置上

例子3:

//老写法
function sum(){
   let s = 0;
   [...arguments].forEach(function(n){

       s += n;
   })
   return s;
}
sum(20,29,44,86,78);//257
//新写法
function sum(...number){
   let s = 0;
   number.forEach(function(n){
         s += n;
   });
   return s;
}
sum(20,29,44,86,78);//257

例子4:

function sayHi(...persons,greeting){}//报错
function fn(...a){console.log(a)}
fn();//空数组