js深拷贝、浅拷贝

news/2024/11/22 19:55:31/

1.浅拷贝

这个很简单,浅拷贝拷贝的就是地址,其中一个修改另一个也会改变。
浅拷贝拷贝的是地址,只会拷贝最外层的对象(即只会拷贝一层)

 <script>const obj={uname:'111',age:18}const os=obj//os就和obj对象一样,但是我们修改os中的obj也会跟随改变os.uname='22'console.log(obj)//obj的uname也会改变</script>

拷贝对象:Object.assign(os,obj) || const os={…obj}
拷贝数组:Array.prototype.concat() || […arr]
存在问题:对象内还有对象的时候进修改内部对象的属性修该其中一个另一个对象也会变化

<script>const obj={uname:'111',age:18,user:{ baby:'内部'}}Object.assign(os,obj)//os就和obj对象一样,但是我们修改os中的obj也会跟随改变os.user.baby='22'console.log(obj)//obj.user.baby也会改变</script>

2.深拷贝

深拷贝拷贝的是值,独立新创建一个地址,两个地址互不影响。
有三种方法 递归函数、外部插件lodash.js百度就能找到官网 JSON.stringify()

2.1使用递归函数进行实现

(函数的内部调用自己就是递归)function fn(){fn() return 条件} 必须有结束条件

 <script>const obj={uname:'111',age:18,hobby:['哈哈','呵呵']user:{ baby:'内部'}}const os={}function deepCopy(newObj,oldObj){for(let k in oldObj){//处理对象内有数组的情况 要先处理数组后处理对象,因为数组属于对象if(oldObj[k] instanceof Array){//声明一个新的空数组让遍历的元素放到空数组中newObj[k]=[]//这里可以写循环,但是我们函数内本身就有for in循环直接俄传参数就可以//难点1deepCopy(newObj[k],oldObj[k])}else if(oldObj[k] instanceof Object){//处理对象内套数组//我们新对象得中得某一个对象就是 newObj[k]={}newObj[k]={}//难点2deepCopy(newObj[k],oldObj[k])}else{//k 属性名 oldObj[k]属性值//newObj[k]就是 os.unamenewObj[k]=oldObj[k]}}}deepCopy(os,obj)</script>

代码种比较难理解的应该是两次函数的自己调用,其实就是传递的参数不一样,那进行函数内部的循环对象也自然不一样,你也可以自己写for循环再进行遍历但是实现起来很麻烦,因为你再次循环数据不一样你需要不同的变量命名还需要把数据传递出去

2.2引入lodash插件

<script src="../lodash.min.js"></script><script>const obj={uname:'111',age:18,hobby:['哈哈','呵呵']user:{ baby:'内部'}}const os=_.cloneDeep(obj)</script>

2.3JSON.stringify()

最简单的方法也最常用

 <script>const obj={uname:'111',age:18,hobby:['哈哈','呵呵']user:{ baby:'内部'}}//先把对象转化为JSON字符串再转化为对象const os=JSON.parse(JSON.stringify(obj))</script>

总结

代码千千万,适合自己最重要。欢迎大家指出不足和问题。


http://www.ppmy.cn/news/723913.html

相关文章

华为手机使用profile闪退问题

方法1: 删除data/data/应用包名/code_chche目录,即可正常使用,已验证可行; 方法2: 网上看到的,找到/data/local/tmp/perfd文件夹&#xff0c;删除它。 (未验证)

华为手机进程cpu,内存占用查看

adb shell top -s cpu是按cpu排序的意思 在手机上用adb shell top -m 10 -s cpu命令时会报top: not integer: cpu adb shell top -s命令只支持0-X数字&#xff0c;默认9&#xff0c;分别指代 013456789101112PIDUSERPRNIVIRTRESSHRS%CPU%MEMTIMECMDLINE 于是 adb shell top …

华为手机滑动速度设置_用华为手机的人,这个设置赶紧关了!速度流畅告别卡顿...

这几年来&#xff0c;华为手机的销量非常的好&#xff0c;周围用华为手机的人也越来越多&#xff0c;不过最近有不少人说&#xff0c;华为手机用久了&#xff0c;老是反应很慢&#xff0c;觉得很卡&#xff0c;电池还不耐用等等的小问题&#xff0c;今天小编教大家几招&#xf…

华为手机使用应用沙盒动态修改cpu数据

较早前文章介绍了怎么样在安卓手机上安装激活XPosed框架&#xff0c;XPosed框架的强大功能大家都清楚&#xff0c;能不修改apk的前提下&#xff0c;修改系统底层的参数&#xff0c;打比方在某些应用需要&#xff0c;大家需要修改手机的某个系统参数&#xff0c;这情况下就需要使…

手机的CPU为什么要区分大小核?

手机 CPU为什么要区分大小核&#xff1f;过去的智能手机CPU其实并没有大小核概念的&#xff0c;尤其是在手机双核CPU出现时两颗核心架构和规模都是一样的&#xff0c;就像电脑上的双核CPU&#xff0c;没有特别针对性的设计大核小核&#xff0c;但是因为智能手机CPU的性能不断提…

CPU框架~ 什么是X86 ?~什么是ARM ? 华为鲲鹏云是什么?

目录 前提与背景 &#xff1a; 什么是CPU&#xff1f; CPU 主要 的功能&#xff1a; CPU 运行过程&#xff1a; 什么是X86 ,X86的CPU类型有哪些 什么是ARM ,CPU类型有那些 复杂指令集&#xff08;CISC&#xff09;与 精简指令集&#xff08;RISC&#xff09;之争 鲲鹏…

华为android是什么手机,为什么说华为的麒麟810是一代神U?

为什么说华为的麒麟810是一代神U&#xff1f; 2020-03-19 13:12:35 1点赞 2收藏 3评论 在很多人的印象里&#xff0c;可能只记得华为的旗舰级别芯片麒麟 9 系列&#xff0c;例如鼎鼎大名的麒麟 990、麒麟 980。但是去年&#xff0c;麒麟中高端芯片 810 一战成名&#xff0c;为华…

华为查看存储正在计算机,华为手机怎么看内存使用情况

大家好&#xff0c;我是时间财富网智能客服时间君&#xff0c;上述问题将由我为大家进行解答。 华为手机查看内存使用情况的步骤是&#xff1a; 1、打开手机后&#xff0c;可以点击进入设置。 2、打开设置后&#xff0c;下拉&#xff0c;点击“存储”选项。 3、打开存储选项后&…