天天手写系列---手写一个深拷贝

289 阅读3分钟

天天手写系列---手写一个深拷贝

一、前言

现在马上就要春招了,是时候需要好好复习一波JavaScript的面试题目。其中,我觉得手写题目是真最能够展现基本功的。所以嘛,我先给自己立下一个flag,往后的时间里,我尽量把前端常遇到的手写题目都亲自手写一遍,以此作为自己的动力哈

先说明一波:前面几天,奈何自己实力不足,只能从简单入门,后面难度再慢慢加大

第一天嘛,就来实现一个大家非常熟悉的深拷贝

二、实现过程

深拷贝,想必大家都非常耳熟了。简单来讲,就是创建一个新对象,这个对象跟被拷贝的对象长得一模一样

下面就开始实现啦~~

首先定义一个deepClone函数,接收一个object对象

function deepClone(obj){
    // ...
}

首先将这个obj参数进行一个判断,如果不是obj或者为null就直接返回

这里有个知识点:typeof null 等于object

if (typeof obj !== 'object' || obj === null) {
    return obj
}

创建一个新的对象newObj,并且根据这个拷贝对象从而确定newObj是数组还是对象

const newObj = Array.isArray(obj) ? [] : {}

下面就开始遍历属性了

for (let key in obj) {
    if (obj.hasOwnProperty(key)) {
        newObj[key] = obj[key]
    }
}

上述代码中,用到了hasOwnProperty,这个方法是用来判断对象是否包含特定的自身(非继承)属性。也就是说,像一些不是我们定义的属性,就没必要往newObj里添加了

到这一步,可能有些小伙伴就以为结束了,但是你会发现,如果属性也是一个对象的情况下,这时候就无法实现深拷贝了

解决方法也非常简单,我们直接使用递归,函数一开始的时候,我们就已经写了递归的终止条件,如果不是object会直接返回原来的值,并不会影响结果

for (let key in obj) {
    if (obj.hasOwnProperty(key)) {
        newObj[key] = deepClone(obj[key])
    }
}

至此,深拷贝也已经实现完毕了

下面给出整体代码:

// 浅拷贝
function deepClone(obj) {
    if (typeof obj !== 'object' || obj === null) {
        return obj
    }

    const newObj = Array.isArray(obj) ? [] : {}

    for (let key in obj) {
        if (obj.hasOwnProperty(key)) {
            newObj[key] = deepClone(obj[key])
        }
    }
    return newObj
}

三、结束语

如果觉得这篇文章对你有帮助,可以伸出你的小手,为这篇文章点个赞

我是前端路上一位新晋的萌新,怀着学习的态度,怀着认识各位同伴的心态,把自己的知识分享出来,除了让自己对知识认知更加巩固,也希望大家能够通过我写的文章学到一点微薄的知识,如果知识内容有误,可以在评论区或者下面公众号告诉我,我会立刻更改

最后,我也创建了一个 【前端收割机】的公众号,希望大家可以关注一波,里面的文章都是掉头发之作