最近在学习c++,以前从来没接触过也没想到过深拷贝和浅拷贝。c++里有深拷贝和浅拷贝,那么其它语言中应该也有。

本文参考:
https://juejin.im/post/59ac1c4ef265da248e75892b

我觉得js中对象复制应该分三种:
1.赋值
2.浅拷贝
3.深拷贝

赋值可以说是最浅得一层了,啥都是原来对象的,不管是基本数据类型(undefined,boolean,number,string,null)还是引用类型。
修改赋值后的对象的数据,那么原对象的数据也会修改。就相当于是个指针指向了复制的对象。

浅拷贝:

var obj1 = {'name' : 'zhangsan','age' :  '18','language' : [1,[2,3],[4,5]],};var obj2 = obj1;  //赋值var obj3 = shallowCopy(obj1);    //浅拷贝function shallowCopy(src) {var dst = {};for (var prop in src) {if (src.hasOwnProperty(prop)) {dst[prop] = src[prop];}}return dst;}

浅拷贝只是将原对象的属性拷贝了过来,修改基本数据类型时原对象不会改变,但是修改引用类型数据时,原对象会改变的。下面时zepto中的深拷贝的代码:

 // 内部方法:用户合并一个或多个对象到第一个对象// 参数:// target 目标对象  对象都合并到target里// source 合并对象// deep 是否执行深度合并function extend(target, source, deep) {for (key in source)if (deep && (isPlainObject(source[key]) || isArray(source[key]))) {// source[key] 是对象,而 target[key] 不是对象, 则 target[key] = {} 初始化一下,否则递归会出错的if (isPlainObject(source[key]) && !isPlainObject(target[key]))target[key] = {}// source[key] 是数组,而 target[key] 不是数组,则 target[key] = [] 初始化一下,否则递归会出错的if (isArray(source[key]) && !isArray(target[key]))target[key] = []// 执行递归extend(target[key], source[key], deep)}// 不满足以上条件,说明 source[key] 是一般的值类型,直接赋值给 target 就是了else if (source[key] !== undefined) target[key] = source[key]}// Copy all but undefined properties from one or more// objects to the `target` object.$.extend = function(target){var deep, args = slice.call(arguments, 1);//第一个参数为boolean值时,表示是否深度合并if (typeof target == 'boolean') {deep = target;//target取第二个参数target = args.shift()}// 遍历后面的参数,都合并到target上args.forEach(function(arg){ extend(target, arg, deep) })return target}

js中深拷贝和浅拷贝问题相关推荐

  1. Python中深拷贝与浅拷贝的区别?

    往期面试题: 列举Python中的标准异常类? 说说Python面向对象三大特性? 说说Python中有几种数据类型? 说说Python模块主要分哪三类? 废话不多说,开始今天的题目: 问:说说Pyt ...

  2. C++中深拷贝和浅拷贝

    C++中深拷贝和浅拷贝的问题是很值得我们注意的知识点,如果编程中不注意,可能会出现疏忽,导致bug.本文就详细讲讲C++深浅拷贝的种种. 对于一般的对象,如: C++代码 int a = 10; in ...

  3. 一文搞懂JS中的赋值·浅拷贝·深拷贝

    前言 为什么写拷贝这篇文章?同事有一天提到了拷贝,他说赋值就是一种浅拷贝方式,另一个同事说赋值和浅拷贝并不相同.我也有些疑惑,于是我去MDN搜一下拷贝相关内容,发现并没有关于拷贝的实质概念,没有办法只 ...

  4. JS的深拷贝和浅拷贝

    今天,CVTE面试官问了深拷贝和浅拷贝的问题 我的回答是:浅拷贝是拷贝了对象的引用,当原对象发生变化的时候,拷贝对象也跟着变化:深拷贝是另外申请了一块内存,内容和原对象一样,更改原对象,拷贝对象不会发 ...

  5. python中深拷贝与浅拷贝的区别

    ####################python中的数据类型####################### ##########python中的数据类型有6种,分别为:数字类型如int,float ...

  6. P110中 深拷贝与浅拷贝问题

    #include<iostream> using namespace std; //深拷贝与浅拷贝//浅拷贝带来的问题就是堆区的内存重复释放,要用 深拷贝来解决 class Person ...

  7. JS中深拷贝的几种实现方法

    概念 首先,我们需要简单了解什么是深拷贝,什么是浅拷贝. 深拷贝:拷贝的是对象或者数组内部数据的实体,重新开辟了内存空间存储数据: 浅拷贝:拷贝的是引用类型的指针,副本和原数组或对象指向同一个内存: ...

  8. 浅析Python中深拷贝和浅拷贝

    按照以下不同情况,在IDE中逐个解除注释,就明白了 import copy""" 第一种情况,不可变类型变量,都是引用 """ # a = ...

  9. python中深拷贝和浅拷贝_**Python中的深拷贝和浅拷贝详解

    甚至连type其本身都是对象,type对象 Python中变量与C/C++/Java中不同,它是指对象的引用,Python是动态类型,程序运行时候,会根据对象的类型 来确认变量到底是什么类型. 单独赋 ...

最新文章

  1. 拦截PHP各种异常和错误,发生致命错误时进行报警,万事防患于未然
  2. Firebug入门指南
  3. 8、使用SELECTI...INTO OUTFILE导出表数据
  4. 【JavaSE_08】Java中static、继承、重写
  5. c#面向对象与程序设计第三版第三章例题代码_C#程序设计教程 | 教与学(教学大纲)...
  6. 面试题3二维数组中的查找
  7. 这月绩效差点没了!搞了一个“新人拼团”活动遇到黑产,搭进去了8台服务器......
  8. WinForm窗体及其控件的自适应
  9. kubectl 获取不到node_排查 Node.js 服务内存泄漏,没想到竟是它?
  10. 转 js控制excel打印完美解决方案
  11. 12.12下周黄金白银价格走势分析及期货原油操作建议布局
  12. vultr服务器可以ping通但是ssh无法连接问题
  13. 【无标题】黑群辉DSM 6.2.3 系统安装图文教程 (2020-12-27更新)
  14. LVM 'Can’t open /dev/sdb1 exclusively. Mounted filesystem?' Problem
  15. Ubuntu下如何获取usb相机的PID/VID并打开指定的相机
  16. 一起实践神经网络INT8量化系列教程(一)
  17. matlab交流电路仿真,【2017年整理】7基于MATLAB的交流电机仿真.ppt
  18. YoLov3训练自己的数据集(小白手册)
  19. 如何将数据库中text字段中返回的数据转换成数组的形式,并且将字符串的数字转换成数字的形式显示
  20. 魔界中的黑V天險(3)

热门文章

  1. python数组改变维数
  2. 青龙羊毛——广汽三菱(搬运)
  3. 多进程和多线程的概念
  4. mysql 切表_mysql--------命令来操作表
  5. str_pad函数php,str_pad
  6. VScode中html怎么引入js,vscode中如何使用typescript,如何自动编译成js文件
  7. 重新精读《Java 编程思想》系列之向上转型与向下转型
  8. 用windows自带压缩备份mysql_Windows下配合计划任务的Mysql定时压缩备份
  9. gprof使用介绍 (gcc -pg)
  10. Mysql (InnoDB引擎)聚集索引和辅助索引