摘要:深拷贝是指在将一个对象复制给另一个对象时,如果对象内部还含有其他对象,也将这些对象复制一份到新对象中,而不是只复制对象的指针地址。换句话说,当你对原对象进行改变时,新对象不会受到任何影响,因为它们是完全独立的。
深拷贝是指在将一个对象复制给另一个对象时,如果对象内部还含有其他对象,也将这些对象复制一份到新对象中,而不是只复制对象的指针地址。
换句话说,当你对原对象进行改变时,新对象不会受到任何影响,因为它们是完全独立的。
通俗点讲,浅拷贝只是在内存中建立一个新的指针指向已经存在的堆内存,而深拷贝则在内存中建立一个新的指针,并开辟新的堆内存存储拷贝的内容。
浅拷贝就是指数据之间的拷贝只复制引用和地址,目标对象与原始对象会有相同的内存地址。
换句话说,浅拷贝只是对原对象的一个简单地址引用,因此如果改变了拷贝后的对象,也会影响到原对象。
1. 新对象是与原对象一模一样的完全独立的对象,两者间毫无关联,新对象的改变不会影响到原对象的属性。
2. 形象化地说,深拷贝就好比是“买一支全新的笔”,而浅拷贝则好比是“借用他人的笔”。
3. 当原始对象是值类型(例如int、float、bool等)或空时,深拷贝和浅拷贝没有任何区别。
4. 一般情况下,浅拷贝效率更高,深拷贝的效率较低。
1. 对于简单的对象,使用浅拷贝即可;
2. 如果对象间不相互嵌套,也可以放心地使用浅拷贝;
3. 如果对象之间相互嵌套,建议使用深拷贝,否则可能会引发一些不必要的风险;
4. 在React中,建议使用深拷贝,特别是在子组件中使用了父组件中的对象时,如果使用浅拷贝,改变子组件中的对象会直接影响到父组件中的对象;
5. 在Vue中,由于Vue的数据响应式特性,建议尽量使用深拷贝,因为浅拷贝会造成Vue数据混乱的问题。
1. 直接赋值,将原始对象赋值给新对象,如:let newObj = {} = oldObj;
2. Object.assign()方法,实现将从一个或多个源对象中获取属性复制到目标对象,如:let newObj = Object.assign({}, oldObj);
3. Spread运算符,从源对象中获取属性复制到目标对象,如:let newObj = {...oldObj};
1. Object.assign() + for-in + 递归,如:
```
function deepCopy(obj) {
let newObj = {}
for(let key in obj) {
if(typeof obj[key] === object){
newObj[key] = deepCopy(obj[key])
}else{
newObj[key] = obj[key]
}
}
return newObj
}
```
2. JSON.parse(JSON.stringify()),如:
```
function deepCopy(obj) {
return JSON.parse(JSON.stringify(obj))
}
```
注意:使用该方法,需要注意对象中不能含有函数、undefined、NaN等,因为该方法无法正确处理这些类型的数据。
深拷贝和浅拷贝,都是非常常用的概念,也是我们在开发过程中必须掌握的基本操作。
对于简单的对象或数据类型,我们可以直接使用浅拷贝;而对于嵌套比较深的对象结构,我们则需要使用深拷贝。
掌握深浅拷贝的差异,对于提高代码的鲁棒性和稳定性是很重要的,希望本文能够对你有所帮助。
【相关文章】
★ 如何防止壁虎爬床