变量的解构赋值

更加便利的从匿名对象或者数组中,对变量进行赋值;

数组的解构赋值

基本样式,右边数据类型必须是可迭代的类型。

let a = 1,
    b = 2,
    c = 3;
//等价于   
//let [a, b, c] = [1, 2, 3];

对于let [a, b, c] = [1, 2, 3];就是按照[, , ,]这样的模式一一对abc进行赋值
对于数组类型的模式匹配取值还算简单的,比较容易

  • 完全解构

    let [a, [b, [c, d], e]] =[1, [2, [3, 4], 5]];  
    let [a, , b] = [1, ,3];
    let [,,...c] = [1, 2, 3, 4];  
    //...是将数组解构成一串用逗号分割的参数 ; c = [3, 4]
  • 不完全解构

    let [c] = [];     //c = undefined
    let [a, b] = [1]; //b = undefined
  • 解构报错,要么不能转成对象,要么转了也不可迭代
    原生可迭代的类型有:Array,Map,Set,String,TypedArray,函数的arguments对象,NodeList对象

    let [a, b] = "1234"; //a = 1; b = 2
    
    //或者undefined,NaN,false,1,null 这些都不行
    let [a] = {a : 2}; //报错 {a : 2}is not iterable

设置默认值
用来对不匹配成功的变量赋初始值

let [a = 123] = [];      //a = 123
let [c, d = 123] = [1]   //d = 123
let [b = 123] = [1];     //a = 1

上面例子说明一点:匹配成功时,不使用默认值,不成功或者值为undefined时使用默认值

let [d = c] = [1];      //d = 1
let [d = c] = [];       //报错

上面例子说明两点:1.不能使用未声明的变量进行默认值设定,2.在匹配成功时,引擎是不管它的,要不然就报错了

对象的解构赋值

个人理解认为,对象解构赋值时,key的模式匹配,对value变量的赋值,其右边对象,可以不是迭代类型(个人猜测,有待商榷)
基本样式:

let {a} = {a : 1};   //a = 1;
let {a : c} = {a : 1};   //c = 1;

实际上它是let {a : a} = {a : 1};key的a是模式匹配,value的a是变量,用于成功后的赋值{a : 1, c : {d : 1}};对于这样想要分别取1,{d:1},1这3个值,怎么写匹配模式

let {a:a,c:c,c:{d:d}} = {a : 1, c : {d : 1}}; //最简单繁琐的

可以简化一下let {a,c,c:{d}} = {a : 1, c : {d : 1}};,
同理let {p, p : [h, ay], p : [, {y}]} = {p: ['Hello',{ y: 'World' }]};
规则允许左边不存放任何变量名,也就是为空对象,没有意义但又是合法的表达式

({} = [true, false]);
({} = 'abc');
({} = []);

非变量声明的解构必需用括号括起来,不然会报错,如上是表达式,括起来就不会报错

包装类对象的解构

let {1:a} = "zxc";
let {toString: b} = "qwe";
console.log(b === String.prototype.toString);

将"zxc" => new String("zxc"),再将其解构

函数参数的解构

function move({x = 0, y = 0} = {}) {
  return [x, y];
}
move({x:3});  //[3, 0]
move();       //[0, 0]

这个参数解构有两个作用:1.x,y的默认值为0,0;2.move()参数默认值为{},所以当未输入时传入的实参为{}
不用于下面的

function move({x, y} = {x: 0,y: 0}) {
  return [x, y];
}
move({x:3})  //[3, undefined]
move();      //[0, 0]

上面例子并没有对x,y进行默认值的设定,只是对move(),传入实参进行了{x: 0,y: 0}的默认值设定

用途

个人理解:从类似数组或者对象的数值集合中快速提取自己想要的值
有趣的应用就是数值之间的交换

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

因为数组的解构必须按顺序来,不像对象的解构,按key模式匹配
其他应用有待自己对解构更加灵活的应用


Infinity
293 声望9 粉丝

学前端中,只想激情优雅的写代码