温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
  • 忘记密码?
登录注册×
获取短信验证码
其他方式登录
点击 登录注册 即表示同意 《亿速云用户服务条款》
  • 服务器
  • 数据库
  • 开发技术
  • 网络安全
  • 互联网科技
登 录 注册有礼
最新更新 网站标签 地图导航
产品
  • 首页 > 
  • 教程 > 
  • 开发技术 > 
  • js的深拷贝是什么

js的深拷贝是什么

发布时间:2022-03-04 11:33:02 来源:亿速云 阅读:116 作者:小新 栏目: 开发技术

这篇文章主要为大家展示了“js的深拷贝是什么”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“js的深拷贝是什么”这篇文章吧。

    js深拷贝

    在讲正题之前我们要先了解数据存储的方式

    数据存储方式

    在讲之前我们要先知道值类型和引用类型的存储方式。

    在JavaScript数据类型中有两种数据类型。

    值类型:字符串(String)、数字 (Number)、布尔 (Boolean)、空(Null)、未定义(Undefined)、Symbol

    存放在栈内存中的简单数据段,数据大小确定,内存空间大小可以分配。

    引用数据类型:对象 (Object) 、数组 (Array) 、函数 (Function) 。

    存放在堆内存中的对象,在栈内存中存的是一个指针,这个指针指向堆内存一个位置。再从堆内存中取得所需的数据。

    存储如下图:

    js的深拷贝是什么

    什么是浅/深拷贝

    讲完存储的方式,我们来讲讲浅拷贝和深拷贝

    拷贝也就是我们常常讲的copy,ctrl+c,ctrl+v,那么我们来看看例子

    当我们对分别值类型和引用类型进行赋值。

     var a = 5
         var b = a
         b += 5
         console.log('a=' + a,'b=' + b)
         var arr=[1,2,3]
         var brr=arr
         brr.push(10)
         console.log("arr为",arr)
         console.log("brr为",brr)

    js的深拷贝是什么

    现象:我们发现值类型并没有互相受到影响,然而数组(引用类型)brr数组添加元素的时候改变了arr数组。

    解释分析:浅拷贝只会发生在引用类型身上,对于引用类型如果之进行简单的赋值,只会赋值指向堆内存的指针,这种称为浅拷贝。而深拷贝就是完全拷贝一个引用类型,为不是地址指针。

    浅拷贝看下面这张原理图:

    js的深拷贝是什么

    常用深拷贝实现

    那么我们在赋值引用类型的时候肯定不能出现浅拷贝的现象,对原数据产生影响了。那么就要进行深拷贝

    1.通过JSON.stringify和JSON.parse

    可以深拷贝的数组和对象,但是不能拷贝函数,可以进行对象或者数组的嵌套拷贝。

    缺点:无法实现对对象中方法的深拷贝

    使用

     var brr=JSON.parse(JSON.stringify(arr))

    例子:

      var arr = {
             name: '浪漫主义码农',
             age: 20,
             adress: ['jiangxi', 'changsha'],
             friends: {
                 friend1: '张三',
                 friend2: '李四'
             },
             function(){
                 console.log("我是浪漫主义的对象")
             }
         }
         var brr=JSON.parse(JSON.stringify(arr))
         brr.name='法外狂徒张三'
         brr.adress[0]='长沙'
         console.log("arr为", arr)
         console.log("brr为", brr)

    js的深拷贝是什么

    2.扩展运算符

    利用了对象的结构赋值特性方法。

    缺点:无对对象里面嵌套的对象进行深拷贝,相当于只是对一层引用对象进行深拷贝

    使用:

     var brr={...arr}

    例子:

      var arr = {
             name: '浪漫主义码农',
             age: 20,
             adress: ['jiangxi', 'changsha'],
             friends: {
                 friend1: '张三',
                 friend2: '李四'
             },
             function(){
                 console.log("我是浪漫主义的对象")
             }
         }
         var brr={...arr}
         brr.name='法外狂徒张三'
         brr.adress[0]='长沙'
         console.log("arr为", arr)
         console.log("brr为", brr)

    js的深拷贝是什么

    3.手写递归深拷贝函数

    完美解决

    函数:

      //使用递归实现深拷贝
         function deepClone(obj) {
             //判断拷贝的obj是对象还是数组
             var objClone = Array.isArray(obj) ? [] : {};
             if (obj && typeof obj === "object") { //obj不能为空,并且是对象或者是数组 因为null也是object
                 for (key in obj) {
                     if (obj.hasOwnProperty(key)) {
                         if (obj[key] && typeof obj[key] === "object") { //obj里面属性值不为空并且还是对象,进行深度拷贝
                             objClone[key] = deepClone(obj[key]); //递归进行深度的拷贝
                         } else {
                             objClone[key] = obj[key]; //直接拷贝
                         }
                     }
                 }
             }
             return objClone;
         }

    例子:

      var arr = {
             name: '浪漫主义码农',
             age: 20,
             adress: ['jiangxi', 'changsha'],
             friends: {
                 friend1: '张三',
                 friend2: '李四'
             },
             fun: function(){
                 console.log("我是" + this.name + "的对象")
             }
         }
         var brr = deepClone(arr)
         brr.name = '法外狂徒张三'
         brr.adress[0] = '长沙'
         console.log("arr为", arr)
         arr.fun()
         console.log("brr为", brr)
         brr.fun()
     
         //使用递归实现深拷贝
         function deepClone(obj) {
             //判断拷贝的obj是对象还是数组
             var objClone = Array.isArray(obj) ? [] : {};
             if (obj && typeof obj === "object") { //obj不能为空,并且是对象或者是数组 因为null也是object
                 for (key in obj) {
                     if (obj.hasOwnProperty(key)) {
                         if (obj[key] && typeof obj[key] === "object") { //obj里面属性值不为空并且还是对象,进行深度拷贝
                             objClone[key] = deepClone(obj[key]); //递归进行深度的拷贝
                         } else {
                             objClone[key] = obj[key]; //直接拷贝
                         }
                     }
                 }
             }
             return objClone;
         }

    js的深拷贝是什么

    以上是“js的深拷贝是什么”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注亿速云行业资讯频道!

    向AI问一下细节
    推荐阅读:
    1. JS中如何实现深拷贝
    2. JS实现数组深拷贝的方法分析

    免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

    js
    • 上一篇新闻:
      Java虚拟机中内存分配与回收策略的示例分析
    • 下一篇新闻:
      linux中qt指的是什么意思

    猜你喜欢

    • c#中console的用法是什么
    • mysql重复数据去重的方法是什么
    • php中elasticsearch的特点有哪些
    • matlab未检测到支持的编译器怎么办
    • C++动态内存分配是怎么实现的
    • mysql中count和distinct的用法是什么
    • pgsql中批量删除的功能怎么使用
    • java中console如何调出来
    • elasticsearch集群迁移数据的方法是什么
    • matlab安装编译器的步骤是什么
    最新资讯
    • Kylin是否支持数据脱敏和隐私保护
    • Kylin如何保证数据的一致性
    • 如何解决Kylin在使用过程中遇到的常见问题
    • Kylin的升级策略是怎样的
    • 如何选择适合的Kylin版本进行部署
    • 如何评估Kylin是否适合企业的需求
    • Kylin在数据仓库转型中扮演什么角色
    • Kylin与其他大数据查询引擎的比较如何
    • Kylin如何帮助企业做出更好的决策
    • Kylin在哪些行业有广泛应用
    相关推荐
    • python深拷贝指的是什么
    • JS中的深拷贝与浅拷贝是什么
    • 如何实现JS 数组和对象的深拷贝
    • JS深拷贝与浅拷贝的用法
    • js递归如何实现深拷贝
    • Javascript中深拷贝的原理是什么
    • Javascript深拷贝是什么
    • javascript深拷贝是什么及怎么用
    • js如何实现深拷贝
    • JS怎么实现深拷贝和浅拷贝

    相关标签

    json json格式 json数据 bjs js深入浅出 fastjson execjs js数组 jsonfield js-sdk js开发 js脚本 nw.js wow.js nestjs thinkjs3 js-cookie qrcode.js nest.js wavesurfer.js
    AI

    深圳SEO优化公司株洲关键词排名价格诸城网站搭建多少钱驻马店网站开发推荐梅州网站seo优化公司武威SEO按天收费随州网站seo优化荆门网站搭建价格海西网站推广方案价格阳江seo优化报价横岗网站开发公司新余百姓网标王推广报价三亚关键词按天扣费公司木棉湾网站优化软件多少钱平顶山seo优化哪家好昌都英文网站建设价格中山网站建设设计红河设计公司网站横岗seo价格秦皇岛网络营销报价银川建站宝鸡网站优化按天计费哪家好百色网站排名优化公司焦作网站优化推广推荐盐城百度网站优化排名多少钱沈阳企业网站设计推荐吕梁至尊标王公司南昌关键词按天计费哪家好罗湖至尊标王哪家好抚顺关键词按天扣费价格晋城网站建设哪家好歼20紧急升空逼退外机英媒称团队夜以继日筹划王妃复出草木蔓发 春山在望成都发生巨响 当地回应60岁老人炒菠菜未焯水致肾病恶化男子涉嫌走私被判11年却一天牢没坐劳斯莱斯右转逼停直行车网传落水者说“没让你救”系谣言广东通报13岁男孩性侵女童不予立案贵州小伙回应在美国卖三蹦子火了淀粉肠小王子日销售额涨超10倍有个姐真把千机伞做出来了近3万元金手镯仅含足金十克呼北高速交通事故已致14人死亡杨洋拄拐现身医院国产伟哥去年销售近13亿男子给前妻转账 现任妻子起诉要回新基金只募集到26元还是员工自购男孩疑遭霸凌 家长讨说法被踢出群充个话费竟沦为间接洗钱工具新的一天从800个哈欠开始单亲妈妈陷入热恋 14岁儿子报警#春分立蛋大挑战#中国投资客涌入日本东京买房两大学生合买彩票中奖一人不认账新加坡主帅:唯一目标击败中国队月嫂回应掌掴婴儿是在赶虫子19岁小伙救下5人后溺亡 多方发声清明节放假3天调休1天张家界的山上“长”满了韩国人?开封王婆为何火了主播靠辱骂母亲走红被批捕封号代拍被何赛飞拿着魔杖追着打阿根廷将发行1万与2万面值的纸币库克现身上海为江西彩礼“减负”的“试婚人”因自嘲式简历走红的教授更新简介殡仪馆花卉高于市场价3倍还重复用网友称在豆瓣酱里吃出老鼠头315晚会后胖东来又人满为患了网友建议重庆地铁不准乘客携带菜筐特朗普谈“凯特王妃P图照”罗斯否认插足凯特王妃婚姻青海通报栏杆断裂小学生跌落住进ICU恒大被罚41.75亿到底怎么缴湖南一县政协主席疑涉刑案被控制茶百道就改标签日期致歉王树国3次鞠躬告别西交大师生张立群任西安交通大学校长杨倩无缘巴黎奥运

    深圳SEO优化公司 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化