乐趣区

关于javascript:JS使用递归实现对象的深拷贝

刚开始对 递归 很不了解,然而在我的项目中其实要常常用到。

明天就想简略的把这个问题和陈词滥调的对象深拷贝联合到一起讲讲。

我感觉看我的文章的用户大部分都是刚入门的新人,所以我这里衍伸再强调一下,什么叫函数,什么叫办法。

上面是一个函数,作用就是打印进去传入的那个值。没错,这就是一个简略的函数。

当这个函数,作为一个对象的属性值时候,那么这个函数 read 就被称为该对象身上的办法。(这里其实也能说是 window 对象身上的办法,因为定义在全局的函数默认是 windows 身上的一个属性,这里临时不抬杠这种模式)

什么意思呢?如下:

此时,这个函数 read,通过 rookie.read 的模式调用时,就被称为 rookieread办法。

说白了,罕用的 console.log 函数,就是 window 对象身上的办法。


1. 浅拷贝

首先咱们先简略设计一个对象的浅拷贝,浅拷贝可千万不要认为就是


咱们临时不思考太难的逻辑,只做简略的场景。

1. 首先,这个函数既然是克隆对象的作用,那么就得承受一个 对象 作为参数吧?而后,咱们还得返回一个新的对象,就须要在函数体内设置一个新的对象,来筹备作为返回值。(Record<string,any> 是束缚对象 key,value 类型的,临时能够不去思考,咱们临时只思考这个参数 obj 必定是一个非法的对象)

假如为下图的对象:

2. 咱们须要去遍历参数的 key,而后把每个对应的value 当成新的字符串去复制给obj2

我刚开始看到这个代码的时候,的确很难了解,然而咱们这样写的话!是不是就清朗

再变变 —–>>

这样是不是就能看懂了?其实原理就是这样简略。最初 returnobj2

二. 递归

当初有一种场景,如果我 objvalue也是一个对象呢?打个比方就是上面的这样:

那么代码执行到这里

就会是这样的成果:

object2.fridens=object.fridens

—->
object2.fridens={name1:"小红",name2:"小黄"}

咱们都晓得援用类型这样的赋 其实是赋 ,是不合理的,所以咱们须要判断 objvalue是不是一个对象 (实际上还包含数组) 类型,(数组 array 类型咱们放到前面探讨)

那么咱们再去调用这个函数本身不就能够了吗?

看着难懂?ok,那么这样写是不是就好了解了?(假如只有两层嵌套对象)


能够多浏览代码,了解几遍。

退出移动版