ES6

149 阅读2分钟

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:

  • 对象的赋值