天天手写系列---手写一个深拷贝
一、前言
现在马上就要春招了,是时候需要好好复习一波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
}
三、结束语
如果觉得这篇文章对你有帮助,可以伸出你的小手,为这篇文章点个赞
我是前端路上一位新晋的萌新,怀着学习的态度,怀着认识各位同伴的心态,把自己的知识分享出来,除了让自己对知识认知更加巩固,也希望大家能够通过我写的文章学到一点微薄的知识,如果知识内容有误,可以在评论区或者下面公众号告诉我,我会立刻更改
最后,我也创建了一个 【前端收割机】的公众号,希望大家可以关注一波,里面的文章都是掉头发之作