JS 深拷贝

手写js深拷贝

1、序列化,缺点:会忽略undefined,NaN

JSON.parse(JSON.stringify(arr))

2、递归

function isTypeof(data) {

    return Object.prototype.toString.call(data).slice(8, -1)

}

function deepCopy(data) {

    let type = isTypeof(data)

    let obj

    if (type === 'Array') {

        obj = []

        for (let i = 0; i < data.length; i++) {

            obj.push(deepCopy(data[i]))

        }

    } else if (type === 'Object') {

        obj = {}

        for (let keys in data) { // 默认会遍历原型上的属性

            // hasOwnProperty 判断对象上是否存在该属性

            if (data.hasOwnProperty(keys)) {

                obj[keys] = deepCopy(data[keys])

            }

        }

    } else {

        return data

    }

    return obj

}

3、通过展开运算符(一层深拷贝)

const arr = [...arr]

const obj = {...obj}

4、通过Object.assign()复制对象(一层深拷贝)

总结:方法很多,如各种遍历等,我认为核心在于,在堆中创建一个新的空间(空对象),再通过一些手段将数据添加进去,即可实现深拷贝。

点此发表评论
暂无评论