在JavaScript中,浅拷贝和深拷贝是用于复制对象或数组的两种常用方法。它们之间的区别在于复制的程度。
1.浅拷贝:浅拷贝是指创建一个新的对象或数组,将原始对象或数组的引用复制给新的对象或数组。这意味着原始对象和新的对象将共享相同的引用,修改其中一个对象的属性将会影响到另一个对象。浅拷贝通常通过Object.assign()或扩展运算符(...)来实现。
// 浅拷贝示例 const obj1 = {name: 'Alice', age: 25}; const obj2 = Object.assign({}, obj1); obj2.age = 30; console.log(obj1); // { name: 'Alice', age: 25 } console.log(obj2); // { name: 'Alice', age: 30 }
在上面的示例中,通过Object.assign()将obj1的属性复制到obj2。修改obj2的age属性不会影响到obj1,因为它们引用的是不同的对象。
2.深拷贝:深拷贝是指创建一个新的对象或数组,并递归复制所有嵌套的对象和数组,使得原始对象和新的对象完全独立。这意味着修改其中一个对象的属性不会影响到另一个对象。深拷贝通常通过递归遍历对象或数组的属性,并创建新的对象或数组来实现。
// 深拷贝示例 const obj1 = {name: 'Alice', age: 25}; const obj2 = JSON.parse(JSON.stringify(obj1)); obj2.age = 30; console.log(obj1); // { name: 'Alice', age: 25 } console.log(obj2); // { name: 'Alice', age: 30 }
在上面的示例中,通过JSON.stringify()将obj1转换为字符串,然后再通过JSON.parse()将字符串转换为新的对象obj2实现深拷贝。修改obj2的age属性不会影响到obj1。
需要注意的是,深拷贝可能会因为对象或数组属性的循环引用而导致栈溢出或无限循环的问题。因此,在实际应用中,需要根据情况选择合适的方法来实现浅拷贝或深拷贝