js 深拷贝 和 浅拷贝

5 篇文章 0 订阅
订阅专栏
var Obj1 = {'name':'张三','age':28};

var Obj2 = Obj1;

 浅拷贝:直接赋值是浅拷贝方式,Obj2和Obj1在栈中虽然是两个空间,但是他们都指向堆中的同一个空间,当Obj1改变的时候,Obj2也会改变

 深拷贝方法:

方法1:基于基础JSON数据格式的转换,其他如Reg、function、Set、Map等将来出现的数据类型都是不支持的,如果对象中含有这些元素,转换时将丢失

var Obj2 = JSON.parse(JSON.stringify(Obj1));

方法2:定义自己的工具包,实现一个深拷贝,供框架使用  Object.prototype.toString.call() 没有意外情况的对象类型判断

const OBJECT_TYPE = "[object Object]";
//优化:Map会对内部数据持有强引用,导致数据无法被内存回收
//WeakMap:弱引用
//var o1 = new Map(); o1 = null; 无法被回收,操作无用
//var o2 = new WeakMap();o2 = null; 可以回收
const map = new WeakMap();
function deepClone(obj)
{
    //基于数据基本类型,不去处理
    //function不去处理,用来复用
    if(typeof obj !== 'object' || !obj)
    {
        return;
    }
    
    if(map.has(obj)) return map.get(obj);

    let params;
    
    //引用数据类型:按不同的处理方式分类
    //1、通过构造函数入参的
    if(obj instanceof Date || obj instanceof Regex)
    {
        params = obj;
    }
    let tmp = new obj.constructor(params);
    map.set(obj,tmp);
    //2、特殊API添加原色的Set、Map
    if(obj instanceof Map)
    {
        for(let [key,val] of obj)
        {
            //todo:key和val有可能是对象
            tmp.set(deepClone(key),deepClone(val));
        }
    }
    else if(obj instanceof Set)
    {
        for(let val of obj)
        {
            //todo:val有可能是对象
            tmp.add(deepClone(val));
        }
    }
    else if(Array.isArray(obj) || Object.prototype.toString.call(obj) == OBJECT_TYPE )
    {
        for(let key in obj)
        {
            tmp[key] = deepClone(obj[key]);
        }
    }
    //3、通过key + value直接操作的:对象、数组
    return tmp;
}

javascript深拷贝浅拷贝详解
10-20
JavaScript中,深拷贝浅拷贝是两种不同的复制对象或数组的方式,它们在处理复杂数据结构时尤其重要,因为它们决定了原数据和副本之间的关联关系。本文将详细解释这两种拷贝的区别以及如何实现它们。 **一、数组...
javascript深拷贝浅拷贝和循环引用深入理解
10-18
JavaScript中的深拷贝浅拷贝是编程中常见的概念,主要涉及到对象和数组的复制。在JavaScript中,数据类型分为基本数据类型(如Number、String、Boolean等)和引用数据类型(如Object、Array等)。基本类型直接存储...
JS深拷贝浅拷贝
zhumizhumi的博客
05-30 289
// 1 浅拷贝深拷贝的区别 // 1.1 浅拷贝 // 1.1.1 数组 var arr = ['赵云', '关羽', '马超', '张飞', '黄忠'] var a1 = arr a1[0] = '刘备' // 修改a1会修改arr因为a1赋值的是arr的引用 console.log(a1) // ["刘备", "关羽", "马超", "张飞", "黄忠"] console.log(arr) // ["刘备", "关羽", "马超...
js 深拷贝浅拷贝
weixin_43483746的博客
04-12 589
浅拷贝,.map() 方法转换为深拷贝
js深拷贝浅拷贝的区别
Azhongpu的博客
03-28 2320
js深拷贝浅拷贝的区别 如何来区分深拷贝浅拷贝,其实简单,例如: 就是我声明一个obj对象,如何让var a直接等于obj,然后有在obj新增个fun,此时的a也会随着新增个fun,相同a新增数据,obj也会改变,这就是浅拷贝,我直接把比obj地址赋值给我变量啊,当我obj随着改变a也随着改变。理解了浅拷贝深拷贝也就不难理解了,深拷贝就是我只把obj里的数据拷贝过来,你后面obj怎么改变,我a都不会变。 var obj = { name : 'jack', age: '44' } var a =
js深拷贝浅拷贝
Vanessa_Li的博客
07-21 807
手写深拷贝-深度遍历 深拷贝: 深拷贝开辟一个新的栈,两个对象对应两个不同的地址,修改一个对象的属性,不会改变另一个对象的属性。指复制后的新对象重新指向一个新的内存地址,两个对象改变互不影响。...
js 浅拷贝深拷贝
青蛙king的博客
11-19 1156
目录 一、浅拷贝深拷贝的关系 1、基本类型 2、引用数据类型——对象(object) (1)、对象的浅拷贝 (2)、对象的深拷贝 二、对象的浅拷贝的实现 1、ES6中的Object.assign方法实现对象的浅拷贝 2、直接赋值法实现对象的浅拷贝 三、对象的深拷贝的实现 1、ES6中的扩展运算符(...)实现对象的深拷贝 2、用JSON对象的parse和stringify方...
js中的深拷贝浅拷贝区别
lhxsirky的博客
09-03 1715
js中的深拷贝浅拷贝与值传递和引用传递有着些许的关联,都是根据堆栈中数据的储存来传递数据。 下面主要说一下我对深拷贝浅拷贝的理解: 简单举个例子来说明;当我们声明一个a变量并且赋值,并且让b等于a,因为a,b都是基本数据类型所以数据都是存储在栈中,所以改变其中一个变量的数据他们之间不会相互干扰的,这种拷贝就是深拷贝。而浅拷贝就是改变其中一个变量或者对象等参数的值或者属性,另外一个变量或者对...
javascript深拷贝浅拷贝
weixin_47417033的博客
05-21 2093
js常见面试题之深拷贝浅拷贝,包含手撕代码等
js浅拷贝深拷贝
qq_39232387的博客
04-12 2861
1、JS数据类型 基本数据类型:Boolean、String、Number、null、undefined 引用数据类型:Object、Array、Function、RegExp、Date等 2、深拷贝浅拷贝 深拷贝浅拷贝都只针对引用数据类型, 浅拷贝会对对象逐个成员依次拷贝,但只复制内存地址,而不复制对象本身,新旧对象成员还是共享同一内存;深拷贝会另外创建一个一模一样的对象,新对象跟原对象不共享内存,修改新对象不会改到原对象。 区别:浅拷贝只复制对象的第一层属性,而深拷贝会对对象的属性进行递归
详细讲解js中的深拷贝浅拷贝
热门推荐
zhang_cherry的博客
09-27 2万+
深拷贝浅拷贝在其它语言中也经常被提及到,在实际项目开发过程中也常常需要区分当前使用的到底是深拷贝还是浅拷贝,有时候在该使用深拷贝的地方,我们使用了浅拷贝,会导致深藏不露的bug。
面试题】JavaScript 深拷贝浅拷贝 高级
web全栈开发的博客
11-17 665
hello,大家好~ ,本文主要介绍在 JavaScript 中什么是深拷贝浅拷贝,以及如何实现一个对象的深拷贝。给大家推荐一个实用面试题库1、前端面试题库 (
JavaScript深拷贝浅拷贝概念与用法实例分析
01-19
js中的浅拷贝深拷贝,只是针对复杂数据类型(Objcet,Array)的复制问题。简单来讲浅拷贝深拷贝都可以实现在原有对象的基础上再生成一份的作用。但是根据新生成的对象能否影响到原对象可以分为浅拷贝深拷贝。 ...
js中的深拷贝浅拷贝总结
01-08
目录 一、概念 1、浅拷贝 2、深拷贝 ...JavaScript中的数据分为基本类型和引用类型,一般基本类型的数据占用内存大小确定,保存于栈中;引用类型的数据由于在创建之初数据占用内存的大小不确定,但是保
Day43
最新发布
m0_67496588的博客
06-20 910
JSON,Ajax
工具链--nuxt框架 简介(一)
qq_35876316的博客
06-16 380
Nuxt框架是一个基于Vue.js的服务器端渲染(SSR)框架,旨在提供一套完整的前端开发解决方案,帮助开发者构建高性能、可扩展的Web应用。是一个功能强大、易于使用的Web开发框架,适用于多种开发场景和需求。Nuxt框架建立在Vue.js之上,它抽象出了管理异步数据、中间件和路由所涉及的大部分复杂配置。Nuxt不仅继承了Vue.js的所有优点,如易用性、灵活性等,还与Node.js紧密集成,使得开发者可以在项目中轻松地使用Node.js的各种功能。
一个很好用的地图工具的使用:思极地图,以及vue+思极地图的使用
浩星
06-18 398
思极地图,给我们带来了很多便利,这里分享下他的信息与使用。
使用nvm管理nodejs版本,设置淘宝NPM镜像源
d312697510的博客
06-19 179
使用nvm管理nodejs版本,设置淘宝NPM镜像源,修改新的镜像源地址
【element 】修改下拉菜单<el-dropdown样式为横向(超简单)
qq_61798306的博客
06-18 268
【element 】修改下拉菜单
javascript 深拷贝浅拷贝
04-19
好的,关于 Javascript深拷贝浅拷贝的问题,我可以回答。这两种拷贝方式都是针对对象的,浅拷贝只是复制了对象的引用,而深拷贝则是复制了对象本身,包括对象内部嵌套的子对象。常见的浅拷贝方法有 Object....

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
写文章

热门文章

  • VUE fullcalendar 制作排班 2237
  • VUE3+ElementPlus 843
  • 解决前端跨域的三种方式 770
  • Host key verification failed. 426
  • js 脱敏 415

分类专栏

  • js 5篇
  • VUE 6篇

最新评论

  • js 脱敏

    CSDN-Ada助手: 恭喜博主第11篇博客发布成功!对于js脱敏的探讨让我受益匪浅。希望博主能继续保持创作的热情,不断分享有价值的内容。或许下一步可以考虑深入探讨js脱敏的实际应用场景,或者结合其他技术进行更深入的研究。期待博主更多精彩的作品!

  • Host key verification failed.

    CSDN-Ada助手: 恭喜您写了第9篇博客!标题“Host key verification failed.”让我想起了处理技术问题的重要性。您在博客中提到了一个常见的错误,这个问题可能是许多读者在使用主机密钥时遇到的困扰。我非常感谢您分享了解决这个问题的方法。 接下来,我想建议您在未来的创作中继续分享更多关于技术问题和解决方案的实用内容。您的经验和知识对读者来说非常有价值。同时,您也可以考虑探索一些相关的主题,例如网络安全、系统管理等等。这将进一步丰富您的博客,并吸引更多读者。 再次恭喜您的持续创作,期待看到您未来更多的精彩博客!谢谢您的努力与分享。

  • 前端获取设备电池信息

    CSDN-Ada助手: 恭喜博主撰写了第十篇博客!标题中的“前端获取设备电池信息”引起了我的兴趣。你的文章内容对于前端开发者来说肯定是非常有用的。不过,我在这里想提供一些建议,希望能够帮助你进一步改进你的创作。 首先,我认为你可以在博客中进一步探索不同设备的兼容性问题,例如iOS和Android系统中获取设备电池信息的差异。这将帮助读者更好地理解如何在各种设备上应用你提供的解决方案。 其次,你可以考虑添加一些实际的示例代码和演示,以帮助读者更好地理解你所介绍的概念。这将使你的博客更加具有实践性,并且读者可以直接运行代码来验证你的解决方案。 最后,你可以继续分享其他前端开发领域的知识和经验,比如响应式设计、性能优化等等。这将进一步丰富你的博客内容,吸引更多读者。 再次恭喜你的持续创作!期待看到更多优质的内容。谢谢你与我们分享你的知识。

  • 解决前端跨域的三种方式

    CSDN-Ada助手: 恭喜您写了一篇非常有价值的博客,对于前端跨域问题提供了很好的解决方式。我认为您可以继续深入探讨前端开发中的其他难点,并分享给更多人。或许可以写一篇介绍前端性能优化的文章,这也是很多开发者比较关心的问题。再次感谢您的分享,期待更多优质的博客。 CSDN 会根据你创作的博客的质量,给予优秀的博主博客红包奖励。请关注 https://bbs.csdn.net/forums/csdnnews?typeId=116148&utm_source=csdn_ai_ada_blog_reply8 看奖励名单。

  • VUE fullcalendar 制作排班

    CSDN-Ada助手: 恭喜您写下了第7篇博客!您的经验分享对于社区的其他成员来说一定非常有价值。关于下一步的创作建议,我建议您可以继续分享关于VUE fullcalendar的更深入的使用心得,或者探讨其他与排班相关的技术话题。期待看到更多精彩的文章! CSDN 会根据你创作的博客的质量,给予优秀的博主博客红包奖励。请关注 https://bbs.csdn.net/forums/csdnnews?typeId=116148&utm_source=csdn_ai_ada_blog_reply7 看奖励名单。

您愿意向朋友推荐“博客详情页”吗?

  • 强烈不推荐
  • 不推荐
  • 一般般
  • 推荐
  • 强烈推荐
提交

最新文章

  • js 脱敏
  • 前端获取设备电池信息
  • Host key verification failed.
2023年11篇

目录

目录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

深圳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 网站制作 网站优化