💡
原文英文,约2200词,阅读约需8分钟。
📝
内容提要
JavaScript中的对象引用分为值类型和引用类型。值类型(如数字、字符串)在复制时创建新副本,而引用类型(如对象、数组)复制内存地址,修改副本会影响原对象。浅拷贝只复制顶层结构,嵌套对象仍共享内存;深拷贝则完全独立。选择拷贝方式需根据数据结构和需求。
🎯
关键要点
- JavaScript中的对象引用分为值类型和引用类型。
- 值类型(如数字、字符串)在复制时创建新副本,修改新副本不会影响原对象。
- 引用类型(如对象、数组)复制内存地址,修改副本会影响原对象。
- 浅拷贝只复制顶层结构,嵌套对象仍共享内存,深拷贝则完全独立。
- 直接赋值会创建引用副本,修改副本会影响原对象。
- JavaScript支持两种拷贝方式:浅拷贝和深拷贝。
- 浅拷贝方法包括Object.assign()、扩展运算符和数组方法(如slice()和concat())。
- 浅拷贝的嵌套对象仍然共享内存,可能导致意外的副作用。
- 深拷贝分配全新的内存,确保修改副本不会影响原对象。
- 常用的深拷贝方法是JSON.parse(JSON.stringify(obj)),但有数据类型丢失和循环引用的问题。
- 现代JavaScript引入了structuredClone()函数,解决了许多JSON方法的限制。
- 使用库(如Lodash)可以更灵活地进行深拷贝,处理复杂情况。
- 自定义递归实现深拷贝需要考虑多种内置类型和循环引用,复杂度高。
- 选择浅拷贝或深拷贝取决于数据结构和修改需求,需权衡性能和独立性。
❓
延伸问答
JavaScript中的值类型和引用类型有什么区别?
值类型在复制时创建新副本,修改新副本不会影响原对象;引用类型复制内存地址,修改副本会影响原对象。
什么是浅拷贝和深拷贝?
浅拷贝只复制顶层结构,嵌套对象仍共享内存;深拷贝则完全独立,分配全新内存。
如何在JavaScript中实现浅拷贝?
可以使用Object.assign()、扩展运算符或数组方法(如slice()和concat())来实现浅拷贝。
深拷贝的常用方法是什么?
常用的深拷贝方法是JSON.parse(JSON.stringify(obj)),现代JavaScript还支持structuredClone()函数。
使用JSON方法进行深拷贝有什么限制?
JSON方法无法处理函数、undefined、循环引用等,且会丢失某些数据类型。
在什么情况下应该使用深拷贝而不是浅拷贝?
当对象或数组包含嵌套对象,且需要完全独立的副本时,应使用深拷贝。
➡️