JS手写深拷贝

106 阅读1分钟

定义一个对象, 如何对这个对象实现深拷贝呢?

let obj = {
    name: 'zs',
    age: 18,
    fn: function() {
        console.log('吃饭');
    }
} 

递归实现

  1. 创建一个新容器, 存放我们需要拷贝的值
  2. 循环需要拷贝对象的属性
  3. 如果是简单数据类型, 直接去拷贝, 如果是引用数据类型, 就去进行递归
function MyDeepclone(source) {
    // 1.建立一个新容器
    let targetObj = Array.isArray(source) ? [] : {}

    // 2.遍历
    for(let key in source) {

        if(source.hasOwnProperty(key)) {
            // 3.基础类型和引用类型
            if(source[key] && typeof source[key] === 'object') {
                // 引用类型-递归
                targetObj[key] = MyDeepclone(source[key])
            } else {
                // 基础类型-赋值
                targetObj[key] = source[key]
            }
        }
    }
    return targetObj
}

快捷深拷贝

缺点: 不能拷贝对象中的方法

JSON.parse(JSON.stringify(obj))