一、补充
(1)也可以给已声明变量的新属性解构赋值。
let a = [1,2,3],
obj = {};
[obj.d, obj.e, obj.f] = a;
console.log(obj.d, obj.e, obj.f) // => 1, 2, 3
(2)圆括号在解构赋值时的使用场景
只有在赋值语句中,包含非模式部分才可以使用,声明变量语句中(let时,不能有圆括号),函数参数不能时候圆括号。
[(a)] = [1] // 数组解构时,左边结构就是模式,不能用圆括号整体包括起来,可以将变量包括住。
{p: b} = {p:{b:'123'}} // 对象结构时,模式不能用圆括号包起来,变量名可以。
({a:b = {}})
console.log(b) // => {} 没有进行匹配,给b赋了默认值
a ={};
[(a.b)] = [3] // 给a.b进行了赋值 a => {b:3}
(3)对数组进行对象解构
数组也是一种对象,属性名是有顺序的数字,所以也可以进行对象解构。
let {0: a, 1: b, 2: c} = [5,6,7]
console.log(a,b,c) // => 5,6,7
(4)可以对对象拼接属性进行解构赋值,分清楚哪个是模式,那个是变量名就行
let a = 'x', b = 'y', obj = {};
{ a : obj[a + b]} = { a : 123};
console.log(obj) // => {xy : 123}
二、解构赋值的用处
(1)快捷交换变量的值(还有相加相减法,中间变量交换法)
let x = 1, y = 2;
[x,y] = [y,x]
console.log(x,y)
(2)函数参数解构<br />函数参数解构默认值,搭配函数参数默认值,可以防止解构undefined。
function test(url,{x =12, y = {}}){
console.log(x,y)
}
//如果没有传第二个参数,参数解构的时候会报错,不能解构undefined
//如果设置了函数参数默认值的话,就不会报错了
function test( url,{x =12, y = {}} = {} ){
console.log(x,y)
}
test('github.com')
三、解构赋值发生的隐式转化
如果右侧为原始值类型,系统会转化为包装类对象。number、string、boolean都可以转化,undefined和null没有包装类型所以不能转化,解构时会报错。
let [a,b,c,d,e] = 'frank'
console.log(a,b,c,d,e) // => 'f' 'r' 'a' 'n' 'k'
let {toString : dToString} = 123
console.log(dToString) // => funciton ...