JS 浅拷贝 深拷贝

84 阅读2分钟

 1. 浅拷贝和深拷贝的区别?

浅拷贝是指创建一个新的对象,这个新对象的属性与原对象的属性相同。但是,如果属性是引用类型(如数组、对象等),浅拷贝只会复制这些引用类型的地址,而不是它们所指向的数据。因此,原对象和拷贝对象会共享同一份引用类型的数据。这意味着改变拷贝对象中的引用类型属性时,也会影响到原对象。

深拷贝则是递归地复制对象及其所有的层级,无论是基本数据类型还是引用类型,都会创建全新的副本。这意味着修改深拷贝得到的新对象,不会影响到原对象。

总结

  • 浅拷贝:只复制一层,对于嵌套的对象或数组,仍然保持引用。
  • 深拷贝:完全复制所有层次,包括嵌套的对象或数组,使得源对象和拷贝对象完全独立。

2. 浅拷贝常用方法及示例:

数组浅拷贝方法:slice(),concat(),扩展运算符 ...

对象浅拷贝方法: Object.assign(),扩展运算符 ...

浅拷贝示例:

const dataSource = {a:1,b:{c:8}};
const arr1 = [{a:1,b:2},{a:3,b:4}]

let obj =  {...dataSource}
obj.b.c = 78
let newArr = Object.assign({},arr1);
newArr[0].a = 5

转存失败,建议直接上传图片文件

转存失败,建议直接上传图片文件​编辑

3. 深拷贝常用方法及实现:

深拷贝方法:使用JSON方法,第三方库 比如 lodash的_.cloneDeep方法,手写递归实现。

 function deepClone(oobj) {
    let cloneObj = Array.isArray(oobj) ? [] : {}; 
    
    for (const key in oobj) {
        if(typeof oobj[key] == 'object'){
            cloneObj[key] = deepClone(oobj[key])
        } else {
            cloneObj[key] = oobj[key]
        }
    }
    return cloneObj
}