JS对象复制主要分为两种,浅拷贝和深拷贝。浅拷贝只复制原始对象的引用,而深拷贝则是将整个对象复制一份,两者在实际应用场景中均有各自的优势和劣势。
浅拷贝
浅拷贝并不复制对象本身,而是复制对象的引用,因此两个变量指向的是同一个对象,当对象发生改变时,另一个变量也会跟着变化。浅拷贝通常使用Object.assign,Array.slice或展开符等操作。
以Object.assign为例,以下代码复制了对象obj的引用,并创建了一个新对象newObj:
let obj = {a:{b:1}};
let newObj = Object.assign({}, obj); // {a: {b: 1}}
由于复制的只是对象的引用,所以对原始对象进行改变会影响到新对象:
obj.a.b = 2;
console.log(newObj); // {a: {b: 2}}
深拷贝
深拷贝是将原始对象的每一层属性复制一份,生成一个新的对象。这种操作最安全,最不容易出错,但同时也是最耗费性能的。深拷贝可以使用JSON.parse(JSON.stringify(object))或递归函数进行实现。
以下是使用递归函数进行深拷贝的代码:
function deepClone(obj) {
if(typeof obj !== 'object' || obj === null) {
return obj;
}
let newObj = Array.isArray(obj) ? [] : {};
for(let key in obj) {
newObj[key] = deepClone(obj[key]);
}
return newObj;
}
let obj = {a:{b:1}};
let newObj = deepClone(obj); // {a: {b: 1}}
obj.a.b = 2;
console.log(newObj); // {a: {b: 1}}
上述代码中,定义了一个递归函数deepClone,对于传入的参数obj,首先进行类型判断,如果obj不是对象或为null,则直接返回obj,否则使用一个新的对象newObj存储拷贝后的结果,遍历obj的属性,对每个属性进行递归调用并将结果赋值给newObj的相应属性,最后返回newObj。
无论选择哪种复制方式,应当谨慎选择对于当前需求而言最适合的方案进行使用,以避免出现意外的错误。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:JS对象复制(深拷贝和浅拷贝) - Python技术站