解构
对象的解构赋值,可以从一个对象里面取值(属性),相当于将所有可遍历的、但尚未被读取的属性分配到指定的对象上面。
所有的键和值,都会被赋值到新的对象上面。
注意:是浅层的!
前面的取属性好理解,但是后面的“尚未被读取”是啥意思呢?我们写个代码就好理解了。
const obj1 = {
a:1,
b:2,
c:3,
d:4
}
const { a, b, ...x } = obj1
console.log(a,b,x)
解构
先取出来 a 和 b,然后剩余的 c 和 d,都赋给了 x。
扩展运算符必须出现在最后,否则会报错。
扩展运算符
扩展运算符,用于取出参数对象的所有可以遍历属性,并将其复制到当前对象之中。
const obj2 = {
a:1,
b:2,
c:3,
d:4
}
const obj3 = {...obj2}
扩展
obj2的属性都赋值给了obj3。
可能你会问了,这和 obj3 = obj2 有啥区别?
区别在于,一个是“浅层拷贝”,一个是复制指针。
另外还有一点,如果用 const 定义对象的话,只能在定义的时候使用,之后就不能用了。
如果还想用的话,可以使用 Object.assign
vue3 的 reactive 的解构
学习 reactive 的时候经常会看到一种说法,reactive 解构出来就会失去响应性,要用 toRef 来解构。
那么为啥呢?
原因就是解构是一种赋值(get)操作。
而赋值的时候,又要看属性值的类型,如果是基础类型的话,会进行值的拷贝,这样拷贝出来的自然就失去了响应性。
但是要注意,如果是引用类型的话,在 get 的时候,会自动套上一个 reactive,所以解构出来的引用类型(对象、数组等),依然会有响应性。
另外 toRef 并不是 ref(虽然看起来像),而是 reactive[xxx] 的语法糖。