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 是无法转换为对象的,所以解构赋值时会报错