js中的深浅拷贝

js中有深拷贝、浅拷贝一说,所谓的深浅拷贝是针对value类型为引用类型(函数、对象、数组)而言的,大概理解的就是:

  1. 浅拷贝:
  2. 拷贝出的对象c和原始对象ocokey对应的value为引用类型时,其指向同一块内存地址,修改一个必然影响另一个。

举个浅拷贝的例子:

  1. var shallowCopy = function (src) {
  2. var dst = {}
  3. for (const key in src) {
  4. if (src.hasOwnProperty(key)) {
  5. dst[key] = src[key];
  6. }
  7. }
  8. return dst
  9. }
  10. var obj = { a: 1, arr: [2, 3] }
  11. var shallowObj = shallowCopy(obj)
  12. console.log(shallowObj) // { a: 1, arr: [ 2, 3 ] }
  13. // 浅拷贝指向同一地址,修改shallowObj的arr则obj.arr也被修改,a属性是值类型不存在该问题
  14. shallowObj.arr[1] = 5;
  15. console.log(obj) // { a: 1, arr: [ 2, 5 ] }
  16. shallowObj.a = 22
  17. // { a: 1, arr: [ 2, 5 ] } { a: 22, arr: [ 2, 5 ] }
  18. console.log(obj, shallowObj)
  19. var obj2 = { a: 1, t: { b: 3, c: 4, d: { e: 6 } } }
  20. var shallowObj2 = shallowCopy(obj2)
  21. // { a: 1, t: { b: 3, c: 4, d: { e: 6 } } }
  22. console.log(shallowObj2)
  1. 深拷贝:
  2. 深拷贝出的对象和原对象是完全分开的内存地址,不存在修改一个也修改了另一个的问题。

深拷贝的简单实现:

  1. var china = {
  2. nation: '中国',
  3. birthplaces: ['北京', '上海', '广州'],
  4. skincolr: 'yellow',
  5. friends: ['sk', 'ls']
  6. }
  7. //深复制,要想达到深复制就需要用递归
  8. function deepCopy(o, c) {
  9. var c = c || {}
  10. for (var i in o) {
  11. if (typeof o[i] === 'object') {
  12. //要考虑深复制问题了
  13. if (o[i].constructor === Array) {
  14. //这是数组
  15. c[i] = []
  16. } else {
  17. //这是对象
  18. c[i] = {}
  19. }
  20. deepCopy(o[i], c[i])
  21. } else {
  22. c[i] = o[i]
  23. }
  24. }
  25. return c
  26. }
  27. var result = { name: 'result' }
  28. result = deepCopy(china, result)
  29. result.friends.push('slj')
  30. /**
  31. { nation: '中国',
  32. birthplaces: [ '北京', '上海', '广州' ],
  33. skincolr: 'yellow',
  34. friends: [ 'sk', 'ls' ] }
  35. { name: 'result',
  36. nation: '中国',
  37. birthplaces: [ '北京', '上海', '广州' ],
  38. skincolr: 'yellow',
  39. friends: [ 'sk', 'ls', 'slj' ] }
  40. */
  41. console.dir(china)
  42. console.dir(result)

其次,深拷贝使用JSON.parse(JSON.stringify(src))也可以简单实现,只是该实现破坏了原型链;lodash、jquery提供了相应的工具函数来实现深浅拷贝,就不记录了。

js中的深浅拷贝的更多相关文章

  1. Javascript 中的深浅拷贝

    工作中经常会遇到需要复制 JS 数据的时候,遇到 bug 时实在令人头疼:面试中也经常会被问到如何实现一个数据的深浅拷贝,但是你对其中的原理清晰吗?一起来看一下吧! 为什么会有深浅拷贝 想要更加透彻的 ...

  2. 天啦噜!仅仅5张图,彻底搞懂Python中的深浅拷贝

    Python中的深浅拷贝 在讲深浅拷贝之前,我们先重温一下 is 和==的区别. 在判断对象是否相等比较的时候我们可以用is 和 == is:比较两个对象的引用是否相同,即 它们的id 是否一样 == ...

  3. Python 中的深浅拷贝

    Python 中的深浅拷贝 参考文献:https://blog.csdn.net/lnotime/article/details/81194633 参考文献:https://blog.csdn.net ...

  4. 【 js 基础 】 深浅拷贝

    underscore的源码中,有很多地方用到了 Array.prototype.slice() 方法,但是并没有传参,实际上只是为了返回数组的副本,例如 underscore 中 clone 的方法: ...

  5. JavaScript中的深浅拷贝

    深浅拷贝 在JS中,数据类型分为两类: ​ 简单数据类型:Number.Boolean.String.undefined ​ 引用数据类型:Array.Object.Function 简单数据类型通常 ...

  6. JS复习之深浅拷贝

    一.复习导论(数据类型相关) 想掌握JS的深浅拷贝,首先来回顾一下JS的数据类型,JS中数据类型分为基本数据类型和引用数据类型. 基本数据类型是指存放在栈中的简单数据段,数据大小确定,内存空间大小可以 ...

  7. Python中的深浅拷贝

    1.什么是深浅拷贝? python中一切皆对象,python中的数字.字符串.元组等,如果存放在了内存中,这部分内存里面的内容是不会改变的,但是也有情况,内存中存放了可变对象,比如说列表和字典,他们的 ...

  8. Core Python Programming一书中关于深浅拷贝的错误

    该书关于深浅拷贝的论述: 6.20. *Copying Python Objects and Shallow and Deep Copies "when shallow copies are ...

  9. Python基础【3】:Python中的深浅拷贝解析

    深浅拷贝 在研究Python的深浅拷贝区别前需要先弄清楚以下的一些基础概念: 变量--引用--对象(可变对象,不可变对象) 切片(序列化对象)--拷贝(深拷贝,浅拷贝) 我是铺垫~ 一.[变量--引用 ...

随机推荐

  1. MVVM Light 新手入门(2) :ViewModel / Model 中定义“属性” ,并在View中调用

    今天学习MVVM架构中“属性”的添加并调用,特记录如下,学习资料均来自于网络,特别感谢翁智华的利刃 MVVMLight系列. 一个窗口的基本模型如下: View(视图) -> ViewModel ...

  2. PaaS服务之路漫谈(三)

    此文已由作者尧飘海授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. Monolithic架构在产品访问量很大的情况下,有可能常会导致整个产品迭代或升级过程不能按预期进行,或者上 ...

  3. 【2019年OCP新题】OCP题库更新出现大量新题-10

    10.Which two statements are true about SQL*Loader Express Mode in an Oracle 12c database? A) It can ...

  4. POJ 1577Falling Leaves(二叉树的建立)

    题目链接:http://poj.org/problem?id=1577 解题思路:题目是中文就不翻译了,网上都说这题很水,但本蒟蒻虽然知道是倒过来建立二叉搜索树,可是实现不了,得到小伙伴的关键递归思想 ...

  5. 使用VS Code开发.Net Core 2.0 MVC Web应用程序教程之一

    好吧,现在我们假设你已经安装好了VS Code开发工具..Net Core 2.0预览版的SDK dotnet-sdk-2.0.0(注意自己的操作系统),并且已经为VS Code安装好了C#扩展(在V ...

  6. 配置阿里云ESC服务器部署项目

    第一次SSH登录 ECS 服务器: 打开命令行终端(git),键入: > ssh root@39.108.54.110 输入实例密码,进入服务器环境. 配置 root 及应用账号权限 新增管理员 ...

  7. 《JAVA与模式》之适配器模式

    在阎宏博士的<JAVA与模式>一书中开头是这样描述适配器(Adapter)模式的: 适配器模式把一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能 ...

  8. 【GDKOI2017】 两个胖子萌萌哒 小学奥数题

    题目大意:给你一个$n\times m$的网格,你要在这个网格上画三角形. 三角形的顶点只能在网格的整点上,且至少有一条边平行于$x$或$y$轴,且三角形面积为整数.问你能画多少个不同的三角形. 两个 ...

  9. python代码位置引发的错误

    觉得python对代码位置的要求简直是变态,缩进引发的错误我以前在博客里讲过了,如果不懂可以看看我以前的博客,今天又遇到了一个代码位置所引发的错误,现在给大家分享一下: 我想要打印出来一个5*5的实心 ...

  10. Form表单如何可以传递多个值传递List数组对象到后台的解决办法

    举例说明: 后台有一个对象 User ,结构如下: 后台有一个对象 User ,结构如下: public class User{ private String username; private Li ...