什么是深拷贝、浅拷贝
深拷贝:修改新变量的值不会影响原有变量的值。默认情况下基本数据类型都是深拷贝。
浅拷贝:修改新变量的值会影响原有的变量的值。默认情况下引用类型都是浅拷贝。
解构赋值
ES6的新特性,按照一定模式,从数组和对象中提取值,对变量进行赋值,这被称为解构
。具体操作本文章不做描述。
那么我们在使用解构赋值的时候,到底是深拷贝还是浅拷贝呢?我们可以通过以下的例子得出结论:
const a = {
name: 'name',
age: 18,
marriage: false,
addr: { province: 'sichuan', city: 'chengdu' }
}
let { name, age, marriage, addr } = a
name = 'myname'
age = 26
marriage = true
addr.province = 'shanghai'
addr.city = 'shanghai'
console.log(name, age, marriage, addr)
console.log(a)
输出
// myname 26 true {province: "shanghai", city: "shanghai"}
// { name: "name", age: 18, marriage: false, addr: {province: "shanghai", city: "shanghai"} }
以上例子中,我们从对象a中解构赋值了name、age、marriage、addr四个变量,分别是string
、number
、boolean
、object
类型。改变这四个变量的值后,再与a原来的值作对比,我们发现a的name,age,marriage属性没有改变,而addr属性发生了改变。由此可以得出结论,解构赋值对object类型只是浅拷贝。
实际上,无论是使用扩展运算符(...)还是解构赋值,对于引用类型都是浅拷贝。所以在使用splice()、concat()、...对数组拷贝时,只有当数组内部属性值不是引用类型是,才能实现深拷贝。
网友评论