在JavaScript中,浅拷贝和深拷贝都是用于复制一个对象的方式,但它们在复制过程中的方式和结果有所不同。
浅拷贝是创建一个新对象,将原始对象的属性值复制到新对象中。如果属性是基本类型,则直接复制其值;如果属性是引用类型,则复制的是引用地址,因此新旧对象会共享同一个引用地址。浅拷贝只复制了对象的一层,不会递归复制子对象。
举例说明浅拷贝:
// 使用Object.assign()进行浅拷贝 const obj1 = { foo: 'bar', age: 20 }; const obj2 = Object.assign({}, obj1); obj2.foo = 'baz'; console.log(obj1); // { foo: 'bar', age: 20 } console.log(obj2); // { foo: 'baz', age: 20 } // 使用展开运算符(...)进行浅拷贝 const arr1 = [1, 2, [3, 4]]; const arr2 = [...arr1]; arr2[0] = 5; arr2[2].push(6); console.log(arr1); // [1, 2, [3, 4, 6]] console.log(arr2); // [5, 2, [3, 4, 6]]
深拷贝是创建一个新对象,递归地将原始对象及其子对象的属性值复制到新对象中。整个复制过程是完全独立的,新对象和原对象不共享任何引用地址。
举例说明深拷贝:
// 使用JSON.stringify()和JSON.parse()进行深拷贝 const obj1 = { foo: 'bar', age: 20 }; const obj2 = JSON.parse(JSON.stringify(obj1)); obj2.foo = 'baz'; console.log(obj1); // { foo: 'bar', age: 20 } console.log(obj2); // { foo: 'baz', age: 20 } // 使用递归函数进行深拷贝 function deepCopy(obj) { if (typeof obj !== 'object' || obj === null) { return obj; } let copy = Array.isArray(obj) ? [] : {}; for (let key in obj) { if (obj.hasOwnProperty(key)) { copy[key] = deepCopy(obj[key]); } } return copy; } const arr1 = [1, 2, [3, 4]]; const arr2 = deepCopy(arr1); arr2[0] = 5; arr2[2].push(6); console.log(arr1); // [1, 2, [3, 4]] console.log(arr2); // [5, 2, [3, 4, 6]]
使用场景:
- 浅拷贝适用于需要快速创建新对象且只关心第一层属性的情况。例如,将对象的部分属性做修改,而不影响原始对象。
- 深拷贝适用于需要完全独立的新对象,无论是修改新对象还是原始对象,都互不影响的情况。例如,复制对象作为函数参数,保持原始对象的完整性。