当前位置: 首页 > Web前端 > JavaScript

JS用递归实现对象的深拷贝

时间:2023-03-27 00:46:36 JavaScript

一开始不懂递归,但是在项目中经常用到。今天想简单的把这个问题和陈词滥调的对象深拷贝结合起来。感觉看我文章的大部分都是刚入门的新手,所以我这里再强调一下,什么是函数,什么是方法。下面是一个打印出传入值的函数。是的,这是一个简单的函数。当这个函数被用作一个对象的属性值时,那么这个读取的函数就被称为对象上的一个方法。(其实也可以说是window对象上的一个方法,因为全局定义的函数默认是windows的一个属性,这里暂时不用这种形式)什么意思?如下:此时调用rookie.read形式的函数read时,调用的是rookie的read方法。说白了,常用的console.log函数就是window对象上的方法。1.浅拷贝首先我们简单的设计一个对象的浅拷贝。不要以为浅拷贝就是我们暂时不考虑太难的逻辑,只做简单的场景。1.首先,这个函数既然是克隆一个对象,那么它必须接受一个对象作为参数,对吧?然后,我们要返回一个新的对象,所以我们需要在函数体中设置一个新的对象来准备作为返回值。(record是约束对象的key和value类型,暂时可以忽略,我们暂时只考虑参数obj必须是合法的对象。)假设是下图中的object:2.我们需要遍历参数key,然后将每个对应的value作为一个新的字符串复制到obj2中。刚开始看到这段代码的时候,真的很难理解,但是如果我们这么写!明白了再改----->>这样理解可以吗?其实原理就是这么简单。最后返回obj2。2.递归现在有一个场景,如果我的obj的值也是一个对象怎么办?比如下面这样:那么这里的代码执行就会出现这样的效果:object2.fridens=object.fridens---->object2.fridens={name1:"小红",name2:"小黄"}我们都知道引用类型之类的赋值实际上是地址赋值,这是不合理的,所以我们需要判断obj的值是否是对象(其实也包括数组)类型,(后面会讨论数组类型)那么不能我们再次调用这个函数本身?看起来很难理解?好了,这样写是不是很容易理解呢?(假设嵌套对象只有两层)可以多看代码,多看几遍就明白了。