做外贸网站报价单,易企秀网站开发语言,中国建筑工程机械人才培训网官网,湖南省建设厅官方网站一#xff1a;什么浅拷贝#xff1a;
浅拷贝创建一个新对象#xff0c;然后将原始对象的所有属性值复制到新对象中。这意味着#xff0c;如果原始对象的属性值是基本类型#xff08;例如数字、字符串#xff09;#xff0c;那么这些值会被直接复制到新对象中。但如果属…一什么浅拷贝
浅拷贝创建一个新对象然后将原始对象的所有属性值复制到新对象中。这意味着如果原始对象的属性值是基本类型例如数字、字符串那么这些值会被直接复制到新对象中。但如果属性值是引用类型例如对象或数组则新对象中的属性仍然引用原始对象中相同的引用。有一个原始对象如下
let originObj {a: 1,b: 2,c: {d: 4}
}浅拷贝代码如下
let result {};
for(let key in originObj){result[key] originObj[key]
} 这样就实现了一个浅拷贝此时 result 和 originObj 没有指向同一个对象但是 result.c 和 originObj.c 是指向的同一个对象。 同样能达到浅拷贝常见的还有扩展运算符、Object.assign等方法如下
let result1 {...originObj};
let result2 Object.assign({},originObj)二什么是深拷贝
深拷贝创建一个新对象并递归地复制原始对象的所有层级包括嵌套的对象和数组。这意味着新对象和原始对象是完全独立的对新对象的修改不会影响原始对象反之亦然。
如果对象里面不存在正则表达式、函数等特殊值可以直接使用 JSON.parse(JSON.stringify(obj)) 方法直接转成JSON字符串再转换回来就可以实现深拷贝。 也可以通过一些第三方的库实现比如lodash的cloneDeep方法。 当然也可以自己写一个深拷贝的方法这里提供一个比较简单的方法
function deepClone(obj, hash new WeakMap()) {if (obj null || typeof obj ! object) {return obj;}if (hash.has(obj)) {return hash.get(obj);}const cloneObj Array.isArray(obj) ? [] : {};hash.set(obj, cloneObj);for (let key in obj) {if (obj.hasOwnProperty(key)) {cloneObj[key] deepClone(obj[key], hash);}}return cloneObj;
}三总结 浅拷贝 只复制对象的一层对于引用类型的属性复制的是引用而不是值。修改拷贝后的对象可能会影响原始对象。 深拷贝 复制对象的所有层级包括嵌套对象和数组。新对象和原始对象是完全独立的修改一个不会影响另一个。
在实际应用中选择深拷贝还是浅拷贝取决于具体的需求。深拷贝可能涉及到性能开销特别是在处理大型对象或对象包含循环引用的情况下。因此在选择拷贝方式时需要根据项目的需求和性能考虑做出合适的选择。