深拷贝和浅拷贝区别(深入理解深拷贝与浅拷贝的差异)

6302 泣雅彤
摘要:深拷贝是指在将一个对象复制给另一个对象时,如果对象内部还含有其他对象,也将这些对象复制一份到新对象中,而不是只复制对象的指针地址。换句话说,当你对原对象进行改变时,新对象不会受到任何影响,因为它们是完全独立的。

什么是深拷贝

深拷贝是指在将一个对象复制给另一个对象时,如果对象内部还含有其他对象,也将这些对象复制一份到新对象中,而不是只复制对象的指针地址。

换句话说,当你对原对象进行改变时,新对象不会受到任何影响,因为它们是完全独立的。

通俗点讲,浅拷贝只是在内存中建立一个新的指针指向已经存在的堆内存,而深拷贝则在内存中建立一个新的指针,并开辟新的堆内存存储拷贝的内容。

图片.png

什么是浅拷贝

浅拷贝就是指数据之间的拷贝只复制引用和地址,目标对象与原始对象会有相同的内存地址。

换句话说,浅拷贝只是对原对象的一个简单地址引用,因此如果改变了拷贝后的对象,也会影响到原对象。

深拷贝和浅拷贝的主要区别

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等,因为该方法无法正确处理这些类型的数据。

总结

深拷贝和浅拷贝,都是非常常用的概念,也是我们在开发过程中必须掌握的基本操作。

对于简单的对象或数据类型,我们可以直接使用浅拷贝;而对于嵌套比较深的对象结构,我们则需要使用深拷贝。

掌握深浅拷贝的差异,对于提高代码的鲁棒性和稳定性是很重要的,希望本文能够对你有所帮助。

相关文章

发表评论

登录后才能评论

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任如发现本站有涉嫌抄袭侵权/违法违规的内容,请发送邮件至154386093@qq.com举报,一经查实,本站将立刻删除。