一、补充
    (1)也可以给已声明变量的新属性解构赋值。

    1. let a = [1,2,3],
    2. obj = {};
    3. [obj.d, obj.e, obj.f] = a;
    4. console.log(obj.d, obj.e, obj.f) // => 1, 2, 3

    (2)圆括号在解构赋值时的使用场景
    只有在赋值语句中,包含非模式部分才可以使用,声明变量语句中(let时,不能有圆括号),函数参数不能时候圆括号。

    1. [(a)] = [1] // 数组解构时,左边结构就是模式,不能用圆括号整体包括起来,可以将变量包括住。
    2. {p: b} = {p:{b:'123'}} // 对象结构时,模式不能用圆括号包起来,变量名可以。
    3. ({a:b = {}})
    4. console.log(b) // => {} 没有进行匹配,给b赋了默认值
    5. a ={};
    6. [(a.b)] = [3] // 给a.b进行了赋值 a => {b:3}

    (3)对数组进行对象解构
    数组也是一种对象,属性名是有顺序的数字,所以也可以进行对象解构。

    1. let {0: a, 1: b, 2: c} = [5,6,7]
    2. console.log(a,b,c) // => 5,6,7

    (4)可以对对象拼接属性进行解构赋值,分清楚哪个是模式,那个是变量名就行

    1. let a = 'x', b = 'y', obj = {};
    2. { a : obj[a + b]} = { a : 123};
    3. console.log(obj) // => {xy : 123}

    二、解构赋值的用处
    (1)快捷交换变量的值(还有相加相减法,中间变量交换法)

    1. let x = 1, y = 2;
    2. [x,y] = [y,x]
    3. console.log(x,y)
    1. 2)函数参数解构<br />函数参数解构默认值,搭配函数参数默认值,可以防止解构undefined
    1. function test(url,{x =12, y = {}}){
    2. console.log(x,y)
    3. }
    4. //如果没有传第二个参数,参数解构的时候会报错,不能解构undefined
    5. //如果设置了函数参数默认值的话,就不会报错了
    6. function test( url,{x =12, y = {}} = {} ){
    7. console.log(x,y)
    8. }
    9. test('github.com')

    三、解构赋值发生的隐式转化
    如果右侧为原始值类型,系统会转化为包装类对象。number、string、boolean都可以转化,undefined和null没有包装类型所以不能转化,解构时会报错。

    1. let [a,b,c,d,e] = 'frank'
    2. console.log(a,b,c,d,e) // => 'f' 'r' 'a' 'n' 'k'
    3. let {toString : dToString} = 123
    4. console.log(dToString) // => funciton ...