解构赋值是浅拷贝还是深拷贝?
问题场景
已知:
let a = {
name: {
firstname: "Joyce",
lastname: "Lee"
},
age: 20
}
let {name, age} = a
// a.name === name ?
// a.age === age ?
当我第一次被问到这个问题,我直接惊呆了,我用过解构赋值,用过深拷贝和浅拷贝,但是万万没有把这两点连起来想过。
不过仔细思考一个这个问题,实质就是在问解构赋值是深拷贝还是浅拷贝。
分析过程
分析如下:
let {name, age} = a
// 可以转换成
let name = a.name
let age = a.age
这样看来就是简单的赋值了,那么对于基本数据类型来说,赋值是深拷贝;对于引用类型来说,赋值是浅拷贝。所以三等号判断的结果应该是 true
。
为什么两个结果都是true
呢?再仔细分析如下:
a.name
和name
都是Object类型,即引用类型,又是浅拷贝,它们的内存地址指向同一个,并且值也相等,所以说三等号判断的结果是true。
a.age
和age
都是基本类型,且类型相同,数值也相同,所以说三等号判断的结果也是true
。
思考总结
归根结底,解构赋值的本质还是赋值,如果数据类型复杂的话,可以理解为解构赋值的过程是浅拷贝。