JavaScript中的深拷贝和浅拷贝是对于对象和数组而言的,具体区别如下:
浅拷贝Shallow Copy):
- 浅拷贝创建一个新的对象或数组,并复制原始对象或数组的引用。
- 当对原始对象或数组进行浅拷贝后,新对象或数组中的元素仍然是原始对象或数组中元素的引用。
- 修改新对象或数组的元素会影响原始对象或数组,因为它们共享引用。
深拷贝(Deep Copy):
- 深拷贝创建一个全新的对象或数组,并将原始对象或数组中的所有元素递归地复制到新对象或数组中。
- 当对原始对象或数组进行深拷贝后,新对象或数组中的元素与原始对象或数组中的元素完全独立,彼此之间没有任何关联。
- 修改新对象或数组的元素不会影响原始对象或数组,因为它们是完全独立的。
举个例子来说明:
// 原始对象 const obj = { name: "John", age: 30 }; // 浅拷贝 const shallowCopy = obj; // 深拷贝 const deepCopy = JSON.parse(JSON.stringify(obj)); // 修改浅拷贝的属性 shallowCopy.age = 40; console.log(obj.age); // 输出 40,浅拷贝修改了原始对象的属性 // 修改深拷贝的属性 deepCopy.age = 50; console.log(obj.age); // 输出 40,深拷贝不会修改原始对象的属性
总结:
- 浅拷贝只复制一层对象的引用,修改拷贝后的对象会影响原始对象。
- 深拷贝复制所有层级的对象和数组,拷贝后的对象与原始对象完全独立,修改不会互相影响。