1.解构赋值
let obj={
n1:'p1',
n2:'p2'
}
// //传统的写法 定义变量 使n1=obj.n1 n2=obj.n2
// let n1=obj['n1']
// let n2=obj['n2']
//变量名==属性名时
let {n1,n2}=obj //其实是它的简写:let {n1:n1,n2:n2}=obj={ n1:'p1',n2:'p2'}
console.log(n1,n2)
//变量名不等于属性名时
let {n1:x1,n2:x2}=obj
console.log(x1,x2)//p1 p2
let {n,m:m1}={n:'nn',m:'mm'}
console.log(n,m1)// nn mm
2.对象数组嵌套
let obj={a1:[1,2,3],a2:'123'}
//x=obj.a1[0]
//y=obj.a1[1]
let {a2,a1:[x,y]}=obj
console.log(a2,x,y) //'123' 1 2
let obj1={s:{n:'1'},n:[1,'2',3,'4'],m:[[1]]}
let {m:[x1],s:{n},n:[,...m2]}=obj1
console.log(x1,n,m2)// [1] '1' ['2',3,'4']
3.默认值
// let {x,y}={y:2}
// console.log(x,y)// undefined 2
let {x=1,y}={y:2}
console.log(x,y)// 1 2
// let {m:n}={} //m:undefined
// console.log(n) //undefined
let {m:n=4}={} //m:undefined
console.log(n) //4
//默认值生效的条件是对象的属性值必须是undefined 严格等于===
let {a:cc=11}={a:12}
console.log(cc) //12
// let {v=3}={v:undefined}
// console.log(v) //3
let {v=3}={v:null}
console.log(v) //null
//如果解构模式嵌套的是一个对象,而且这个子对象所对应的父属性不存在,那么就会报错了
let {f:{b}}={b:'bb'}
console.log(b) //Cannot destructure property `b` of 'undefined' or 'null'.
//说明:如果赋值的时候赋的不是一个对象,而是其他的数据类型的值,会将其他的数据类型的
//转换为对象
let {x,y}=1
console.log(x,y)//undefined undefined
// 把1转换为对象咋转的呢
console.log(Object(1)) //==>{__proto__:Number}
console.log(Object([1,2,3]))
let {length}=[1,2,3]
console.log(length)// 3
let {a}={a:'a'}
//JavaScript引擎会将{a}理解成一个代码块
//为了避免错误,不要讲{}写在行首
// 注意 :null 和undefined 是无法转换为对象的,所以解构赋值时会报错