什么样的数据能够被解构?可迭代数据或者存在相应的包装类型的数据
(JavaScript中的包装类型:Object、Array、Date、Function、Error、RegExp、Math、Number、String、Boolean、Globle)数组
主要介绍经常使用的三种类型的解构赋值:函数
//一维数组 let [one,two,three] = [1,2,3]; one //1 two //2 three //3 //多维数组 let [x,y] = [[12],[12,34,56]]; x //[12] y //[12,34,56] //不须要赋值的index能够跳过 let [z,,,h] = [1,2,3,[23,45,76]]; z //1 h //[23,45,76] //没有匹配数据时,返回undefined let [i,j] = [1]; i //1 j //undefined ---------- //能够设置默认值 -- 当某一个位置数据 === undefined,则会选取默认值进行赋值 let [x,y=22] = [1]; let [z=33] = [undefined]; let [h=44] = [null]; y //22 z //33 h //null //惰性求值 function foo(){ console.log('lazy evaluation'); return 33; } let [k = foo()] = [1]; let [m = foo()] = []; k //1 //-- 此种状况下不会执行foo函数,相似于 || , //先找寻是否有值可取,没有的状况寻求默认值,也就是执行foo() m //33
//基本用法 let {user,pwd,valid} = {user:'babe',pwd:'123456'}; user //"babe" pwd //"123456" valid //undefined //变量名与属性名不一致的状况,须要定义别名 let {user:u,pwd:p,valid:v} = {user:'babe',pwd:'123456',valid:'xf3g'}; u // "babe" p //"123456" v // "xf3g" //引伸出对象解构赋值的全写形式 -> 省略别名,变量名默认就跟属性名一致了 ({user:user,pwd:pwd,valid:valid} = {user:'babe',pwd:'123456',valid:'xf3g'}) //{属性名:变量名} <=> {user:u} 最终咱们使用的是变量名,即 u ---------- //解构嵌套结构的对象 --嗯,要时刻谨记{属性名:变量名}这种模式 //根据元对象,可变换着进行解构 let obj = { repo:{ qty:1000, settleAmount:3000 } }; let {repo:{qty:number,settleAmount:account}} = obj number //1000 account //3000 //要得到repo,则要下面这种方式 let {repo,repo:{qty,settleAmount}} = obj; repo //{qty: 1000, settleAmount: 3000} qty //1000 settleAmount //3000 //解构失败,当前变量为undefined.若是继续在当前变量下面继续解构,则报错 //就好像一个对象为undefined,仍然去获取对象的属性 -- 报错无疑 let {user:{name}} = {pwd:'123456'}; //Uncaught TypeError: Cannot destructure property `name` of 'undefined' or 'null'.
let [i,j] = "BO"; i //"B" j //"O"
交换变量值 [x,y] = [y,x]; 导入部分模块的功能 import {Component} from '@angular/core'; 少写不少代码一些代码 -- 获取返回值数据的时候可直接解构,避免建立没必要要的临时变量 //res = {status:200,data:[...]} let {status,data} = res;
若是bug,请指正Thanks♪(・ω・)ノlua