2.对象
2.1 解构
解构赋值的内部机制,是先找到同名属性,然后再赋给对应的变量。真正被赋值的是后者,而不是前者。
let {foo:baz}={foo:'aaa',bar:'bbb'}
baz //'aaa'
foo//undeined
上面代码中,foo是匹配的同名属性,baz才是变量。真正被赋值的是变量baz,而不是模式foo。
let obj={
p:{
x:1,
y:2
}
}
let {p:{x,y}}=obj
p//undefined
x//1
y//2
let obj={p:{
x:1,
y:2,
x3:1,
y3:2
}}
let {p:{x2,y2}}=obj
let {p:{x3,y3}}=obj
x2//undefined
y2//undefined
x3//1
y3//1
如果想要得到p值,可以这么修改代码
let obj={
p: {p:{
x:1,
y:2
}}
}
let {p:{p:{x,y}}}=obj
p//{p:{1,2}}
x//1
y//2
2.2 扩展运算符
扩展运算符(...)用于取出参数对象的【所有】可遍历属性,拷贝到当前对象之中。
取出res参数中所有的可遍历对象,赋值给totalData
现在有一个思考:在实际应用场景中,解构和扩展运算符结合起来使用,可以带来什么价值呢?
2.3 扩展运算符解构赋值
解构赋值用于将目标对象所有未被读取,且可遍历的对象【浅拷贝】到指定的对象。
let {x,y,...z}={x:1,y:2,a:3,b:4}
z//{a:3,b:4}
不能复制继承自原型对象的属性
对象的扩展运算符等同于使用Object.assign()方法
可以看出,对象的扩展运算运算,本质上还是编译为Object.assign()
编译后:
扩展某个函数的参数
解构前:
解构后:
举例场景:
- 写一个高度抽象的接口请求,它不关注具体的参数和具体的请求地址,这个时候请求参数params可以使用对象的扩展运算符,调用时由传入的具体实参决定。”
调用的时候: 场景a:
场景b:
- 对象的赋值