js中深拷贝和浅拷贝问题
最近在学习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中深拷贝和浅拷贝问题相关推荐
- Python中深拷贝与浅拷贝的区别?
往期面试题: 列举Python中的标准异常类? 说说Python面向对象三大特性? 说说Python中有几种数据类型? 说说Python模块主要分哪三类? 废话不多说,开始今天的题目: 问:说说Pyt ...
- C++中深拷贝和浅拷贝
C++中深拷贝和浅拷贝的问题是很值得我们注意的知识点,如果编程中不注意,可能会出现疏忽,导致bug.本文就详细讲讲C++深浅拷贝的种种. 对于一般的对象,如: C++代码 int a = 10; in ...
- 一文搞懂JS中的赋值·浅拷贝·深拷贝
前言 为什么写拷贝这篇文章?同事有一天提到了拷贝,他说赋值就是一种浅拷贝方式,另一个同事说赋值和浅拷贝并不相同.我也有些疑惑,于是我去MDN搜一下拷贝相关内容,发现并没有关于拷贝的实质概念,没有办法只 ...
- JS的深拷贝和浅拷贝
今天,CVTE面试官问了深拷贝和浅拷贝的问题 我的回答是:浅拷贝是拷贝了对象的引用,当原对象发生变化的时候,拷贝对象也跟着变化:深拷贝是另外申请了一块内存,内容和原对象一样,更改原对象,拷贝对象不会发 ...
- python中深拷贝与浅拷贝的区别
####################python中的数据类型####################### ##########python中的数据类型有6种,分别为:数字类型如int,float ...
- P110中 深拷贝与浅拷贝问题
#include<iostream> using namespace std; //深拷贝与浅拷贝//浅拷贝带来的问题就是堆区的内存重复释放,要用 深拷贝来解决 class Person ...
- JS中深拷贝的几种实现方法
概念 首先,我们需要简单了解什么是深拷贝,什么是浅拷贝. 深拷贝:拷贝的是对象或者数组内部数据的实体,重新开辟了内存空间存储数据: 浅拷贝:拷贝的是引用类型的指针,副本和原数组或对象指向同一个内存: ...
- 浅析Python中深拷贝和浅拷贝
按照以下不同情况,在IDE中逐个解除注释,就明白了 import copy""" 第一种情况,不可变类型变量,都是引用 """ # a = ...
- python中深拷贝和浅拷贝_**Python中的深拷贝和浅拷贝详解
甚至连type其本身都是对象,type对象 Python中变量与C/C++/Java中不同,它是指对象的引用,Python是动态类型,程序运行时候,会根据对象的类型 来确认变量到底是什么类型. 单独赋 ...
最新文章
- 拦截PHP各种异常和错误,发生致命错误时进行报警,万事防患于未然
- Firebug入门指南
- 8、使用SELECTI...INTO OUTFILE导出表数据
- 【JavaSE_08】Java中static、继承、重写
- c#面向对象与程序设计第三版第三章例题代码_C#程序设计教程 | 教与学(教学大纲)...
- 面试题3二维数组中的查找
- 这月绩效差点没了!搞了一个“新人拼团”活动遇到黑产,搭进去了8台服务器......
- WinForm窗体及其控件的自适应
- kubectl 获取不到node_排查 Node.js 服务内存泄漏,没想到竟是它?
- 转 js控制excel打印完美解决方案
- 12.12下周黄金白银价格走势分析及期货原油操作建议布局
- vultr服务器可以ping通但是ssh无法连接问题
- 【无标题】黑群辉DSM 6.2.3 系统安装图文教程 (2020-12-27更新)
- LVM 'Can’t open /dev/sdb1 exclusively. Mounted filesystem?' Problem
- Ubuntu下如何获取usb相机的PID/VID并打开指定的相机
- 一起实践神经网络INT8量化系列教程(一)
- matlab交流电路仿真,【2017年整理】7基于MATLAB的交流电机仿真.ppt
- YoLov3训练自己的数据集(小白手册)
- 如何将数据库中text字段中返回的数据转换成数组的形式,并且将字符串的数字转换成数字的形式显示
- 魔界中的黑V天險(3)
热门文章
- python数组改变维数
- 青龙羊毛——广汽三菱(搬运)
- 多进程和多线程的概念
- mysql 切表_mysql--------命令来操作表
- str_pad函数php,str_pad
- VScode中html怎么引入js,vscode中如何使用typescript,如何自动编译成js文件
- 重新精读《Java 编程思想》系列之向上转型与向下转型
- 用windows自带压缩备份mysql_Windows下配合计划任务的Mysql定时压缩备份
- gprof使用介绍 (gcc -pg)
- Mysql (InnoDB引擎)聚集索引和辅助索引