面试中如何实现深拷贝

48 阅读1分钟

面试中,面试官经常会问到我们如何实现一个深拷贝, 接下来我们简单看一下深浅拷贝的实现过程和方法

深拷贝和浅拷贝的区别和定义

  • 浅拷贝: 自己创建一个新的对象,来接受你要重新复制会引用的对象值,如果对象属性是基本数据类型,复制的就是基本类型的值给新对象;但如果属性是引用数据类型,复制的就是内存中的地址,如果其中一个对象改变来这个内存中的地址,肯定会影响到另一个对象;
  • 深拷贝: 将一个对象从内存中完整地拷贝出来一份给目标对象,并从堆内存中开辟一个全新的空间存放新对象,且新对象的修改并不会改变原对象,二者实现真正的分离;

浅拷贝方法

  • object.assign
  • 扩展运算符: let cloneObj = { ...obj }
  • 数组的concat
  • slice 拷贝数组

手动实现一个浅拷贝方法

// 对基础类型做一最基本的一个拷贝
// 对引用类型开辟一个新的存储,并且拷贝一层对象属性
const shallowClone = (target) => {
    if(typeof target === 'object' && target !== null) {
        const cloneTarget = Array.isArray(target) ? [] : {}
        for (let prop in target) {
            if(target.hasOwnProperty(prop)){
                cloneTarget[prop] = target[prop]
            }
        }
        return cloneTarget
    } else {
        return target
    }
}

深拷贝方法

  • JSON.stringfy
  • 手写递归
let obj1 = {
    a: {
        b: 1
    }
}

function deepClone(obj) {
    let cloneObj = {}
    for (let key in obj) {
        if(typeof obj[key] === 'object') {
            cloneObj[key] = deepClone(obj[key])
        } else {
            cloneObj[key] = obj[key]
        }
    }
    return cloneObj
}
a = deepClone(obj1)
obj1 = {}
console.log(a)