js深拷贝、浅拷贝

这篇具有很好参考价值的文章主要介绍了js深拷贝、浅拷贝。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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循环直接俄传参数就可以
                  //难点1
                  deepCopy(newObj[k],oldObj[k])
               }else if(oldObj[k] instanceof Object){//处理对象内套数组
                  //我们新对象得中得某一个对象就是 newObj[k]={}
                  newObj[k]={}
                  //难点2
                  deepCopy(newObj[k],oldObj[k])
               }else{
                  //k 属性名 oldObj[k]属性值
                  //newObj[k]就是 os.uname
                  newObj[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>

总结

代码千千万,适合自己最重要。欢迎大家指出不足和问题。文章来源地址https://www.toymoban.com/news/detail-527150.html

到了这里,关于js深拷贝、浅拷贝的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 深入理解 ECMAScript modules:提升你的 JavaScript 技能(一)

    🤍 前端开发工程师、技术日更博主、已过CET6 🍨 阿珊和她的猫_ CSDN 博客专家、23年度博客之星前端领域TOP1 🕠 牛客 高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 🍚 蓝桥云课 签约作者、上架课程《Vue.js 和 Egg.js 开发企业级健康管理项目》、《带你

    2024年02月20日
    浏览(44)
  • [开发语言][c++][python]:C++与Python中的赋值、浅拷贝与深拷贝

    写在前面 :Python和C++中的赋值与深浅拷贝,由于其各自语言特性的问题,在概念和实现上稍微有点差异,本文将这C++和Python中的拷贝与赋值放到一起,希望通过对比学习两语言实现上的异同点,加深对概念的理解。 C++中所谓的 浅拷贝 就是由(系统默认的) 拷贝构造函数对

    2024年02月02日
    浏览(57)
  • ECMAScript6历史-前端开发+ECMAScript+基础语法+入门教程

    我们首先来看 ECMA 是什么。 ECMA ,读音类似“埃科妈”,是 欧洲计算机制造商协会 (European Computer Manufacturers Association)的简称,是一家国际性会员制度的信息和电信标准组织。1994年之后,由于组织的标准牵涉到很多其他国家,为了体现其国际性,更名为 Ecma 国际 (Ecma In

    2024年01月16日
    浏览(49)
  • 【前端灵魂脚本语言JavaScript⑤】——JS中数组的使用

    🐚 作者: 阿伟 💂 个人主页: Flyme awei 🐋 希望大家多多支持😘一起进步呀! 💬 文章对你有帮助👉关注✨点赞👍收藏📂 第一种: var 数组名 = new Array(); 创建一个空数组 第二种: var arr2 = new Array(10); 创建一个定长为10的数组 第三种 var arr3 = new Array(a,b,c); 创建时直接指定元素值

    2023年04月08日
    浏览(65)
  • 开发语言漫谈-JavaScript

           JavaScript、Java名字很相近,但它们没有任何亲缘关系,是由不同公司开发的编程语言。Java由Sun公司(后被Oracle收购)开发,JavaScript最初是由Netscape公司开发的(当年浏览器的霸主)。JavaScript最初的名字是 LiveScript,Netscape将其命名为 JavaScript,无非是蹭 Java流量。当

    2024年04月16日
    浏览(50)
  • 前端框架前置课Node.js学习(1) fs,path,模块化,CommonJS标准,ECMAScript标准,包

    目录 什么是Node.js 定义 作用: 什么是前端工程化 Node.js为何能执行Js fs模块-读写文件 模块 语法: 1.加载fs模块对象 2.写入文件内容 3.读取文件内容 Path模块-路径处理 为什么要使用path模块 语法 URL中的端口号 http模块-创建Web服务 需求 步骤: 案例:浏览时钟 步骤: 什么是模块化 定

    2024年01月16日
    浏览(110)
  • JavaScript深浅拷贝

    1. js浅拷贝只是创建了一个新的对象,复制了原有对象的基本类型的值。 手写实现  2. 深拷贝的原理和实现 将一个对象从内存中完整地拷贝出来一份给目标对象,并从堆内存中开辟一个全新的空间存放新的对象,且新对象的修改并不会改变原对象,二者实现真正的分离

    2024年01月18日
    浏览(41)
  • 【JavaScript】面试手撕深拷贝

    🌈个人主页: 鑫宝Code 🔥热门专栏: 闲话杂谈| 炫酷HTML | JavaScript基础 ​ 💫个人格言: \\\"如无必要,勿增实体\\\" 上次讲了浅拷贝,这次我们来讲深拷贝。有一说一,深拷贝也算是面试时非常常见的题目了。🐶 深拷贝的作用 首先为什么需要深拷贝,因为浅拷贝无法满足我们对原

    2024年03月13日
    浏览(46)
  • 深入探索前端之道:JavaScript深拷贝与浅拷贝的解析与实现

    前端开发中,数据的复制是一个常见的操作。尤其是在处理对象和数组时,我们需要考虑的是一个浅拷贝还是深拷贝。那么,什么是深拷贝和浅拷贝?它们在前端开发中有什么作用?如何实现这两种拷贝?这是我们在本文将讨论的问题。 浅拷贝 浅拷贝是一种数据复制方式,

    2024年02月10日
    浏览(37)
  • JavaScript深浅拷贝的几种方式

    深浅拷贝主要是针对于引用类型而言的 1. JSON.parse(JSON.strigify(Str)) JSON.stringify() 该方法用于将一个字转换为JSON字符串,该字符串符合JSON格式,并且可以被JSON.parse()方法还原。 对于原始类型的字符串,转换结果会带双引号 如果要转换的对象的属性是undefined,函数或xml对象,该

    2024年01月19日
    浏览(51)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包