javascript中的深拷贝和浅拷贝到底是什么(代码片段)

锦鲤儿 锦鲤儿     2023-01-30     119

关键词:

前言:深拷贝和浅拷贝最根本的区别在于是否真正获取一个对象的复制实体,而不是引用。学习深拷贝和浅拷贝之前要先理解什么是基本类型和引用类型。

一、到底什么是基本类型和引用类型?

基本类型:就是值类型,即变量所对应的内存区域存储的是值。
引用类型:就是地址类型,变量所对应的内存区域存储的是地址,真正的数据是在地址对应的内存区域中。

二、基本类型和引用类型在赋值时内存的变化

var age = 20;
var age = 18;//基本类型重新赋值
var arr = new Array(1,2,3,4);
var arr1 = arr;
arr[0] = 5;

内存变化如下

三、深拷贝和浅拷贝

所谓的拷贝可以理解为赋值。

1、基本类型

基本类型在进行赋值时,赋值的是数据,不存在深拷贝和浅拷贝的问题。

2、引用类型

引用类型在进行赋值时,赋的值的地址。

//浅拷贝
var arr1 = new Array(1,2,3);
var arr2 = arr1;

浅拷贝只是把arr1的地址拷贝了一份给arr2,只是增加了一个指针指向已存在的内存地址,当修改arr2的值时,arr1的值也被修改。

接下来看一下深拷贝
1、先定义一个json对象

var person = 
	"age":30,
	"name":"qianxi",
	"movie":new Array("少年的你","长津湖")

2、把person对象进行拷贝一份

var person2 = 
for(let key in person)
	if(typeof person[key]==="object")
		//movie属性进行深拷贝
		person2[key] = [];
		for(let i in person[key])
			person2[key][i] = person[key][i]
		
	 else 
		person2[key] = person[key];//浅拷贝
	

person2.movie[0] = "送你一朵小红花"
console.log(person);
console.log(person2);

我们来看一下打印结果

看一下内存的变化

深拷贝:增加了一个指针并申请了一个新的内存,使这个指针指向这个新的内存。

javascript中的深拷贝和浅拷贝常用方法总结(代码片段)

本文乃学习总结,学习参考自:https://medium.com/javascript-in-plain-english/how-to-deep-copy-objects-and-arrays-in-javascript-7c911359b089对于引用类型(数值类型的拷贝就是字面的拷贝,就不说了)来说,赋值运算符 查看详情

js中的深拷贝和浅拷贝

深复制和浅复制只针对像Object,Array这样的复杂对象的。简单来说,浅复制只复制一层对象的属性,而深复制则递归复制了所有层级。深浅拷贝 的主要区别就是:复制的是引用(地址)还是复制的是实例。所谓 深浅拷贝:对... 查看详情

java中的深拷贝和浅拷贝(转载)

...惑。浅拷贝是指拷贝对象时仅仅拷贝对象本身(包括对象中的基本变量),而不拷贝对象包含的引用指向的对象。深拷贝不 查看详情

objective-c中的深拷贝和浅拷贝

...内容原封不动的给我拿过来。对容器类的深拷贝是对容器中的每个元素都进行拷贝,容器类的浅拷贝是对容器里的内容不进行拷贝,两个容器的地址是不同的,但容器里的所装的东西是一样的,在一个 查看详情

浅谈java中的深拷贝和浅拷贝(转载)

原文链接:http://blog.csdn.net/tounaobun/article/details/8491392假如说你想复制一个简单变量。很简单: intapples= 5; intpears=apples; 不仅仅是int类型,其它七种原始数据类型(boolean,char,byte,short,float,double.long)同样适用于该类情 查看详情

javascript实现引用数据类型的深拷贝和浅拷贝详解(代码片段)

关于引用类型值的详解,请看另一篇随笔 https://www.cnblogs.com/jinbang/p/10346584.html 深拷贝和浅拷贝,也就是引用数据类型栈和堆的知识点。深浅拷贝的原型都是Object,深拷贝指向的栈内存不一样,浅拷贝指向的栈内存一样)... 查看详情

c++中的深拷贝和浅拷贝构造函数(代码片段)

1,对象的构造在实际工程开发当中是相当重要的,C++中使用类就要创建对象,这就涉及了对象的构造,本节课讲解对象的构造和内存操作方面的问题;  2,实际工程开发中,bug产生的根源,必然的会有内存操作的问题,... 查看详情

对象的深拷贝和浅拷贝

...对象时(用一个对象去初始化另外一个对象),会调用类中的拷贝构造函数。如果我们自己没有在类里面写拷贝构造函数,则C++编译器会调用默认的拷贝构造函数。 浅拷贝:如果类定义的对象包含的某个成员是动态内存分配... 查看详情

python中的深拷贝和浅拷贝区别(代码片段)

首先,我们知道Python3中,有6个标准的数据类型,他们又分为可变和不可变。不可变:Number(数字)、String(字符串)、Tuple(元组)。可以变:List(列表)、Dictionary(字典)、Set(集合)。浅拷贝copy模块里面的copy方法实现。... 查看详情

解析js中的深拷贝和浅拷贝(代码片段)

...3:数组深拷贝的实现1.使用for循环 <scripttype="text/javascript"> vararr1=['a','b','c']; vararr2=[]; functiondeepCopy(arr1,arr2) for(vari=0;i<arr1.length;i++) arr2[i]=arr1[i]; deepCopy(arr1,arr2); arr2[1]... 查看详情

解析js中的深拷贝和浅拷贝(代码片段)

...3:数组深拷贝的实现1.使用for循环 <scripttype="text/javascript"> vararr1=['a','b','c']; vararr2=[]; functiondeepCopy(arr1,arr2) for(vari=0;i<arr1.length;i++) arr2[i]=arr1[i]; deepCopy(arr1,arr2); arr2[1]... 查看详情

js的深拷贝和浅拷贝

浅拷贝和深拷贝都是对于复杂对象Object和Array来说的,对于直接量来说,复制的是值,也就不存在深浅的区别.对于对象来说,浅拷贝就是将自身的属性复制到另外一个空对象上,深拷贝则更近一步,它会将对象的对象属性进行递归拷贝,... 查看详情

详解java技术的深拷贝和浅拷贝

...会问的问题,而且了解深拷贝和浅拷贝的原理,对于Java中的所谓值传递或者引用传递将会有更深的理解。1、创建对象的5种方式①、通过new关键字这是最常用的一种方式,通过new关键字调用类的有参或无参构造方法来创建对象。... 查看详情

python的深拷贝和浅拷贝

参考技术A1.什么是深拷贝?什么是浅拷贝?(深拷贝与浅拷贝的区别)简单点来说,就是假设B复制了A,当修改A时,看B是否会发生变化,如果B也跟着变了,说明这是浅拷贝,拿人手短,如果B没变,那就是深拷贝,自食其力。也可... 查看详情

java中的深拷贝和浅拷贝(代码片段)

目录🍎引出拷贝🍎浅拷贝🍎深拷贝🍎总结引出拷贝现在有一个学生类和书包类,在学生类中有引用类型的书包变量:classSchoolBagprivateStringbrand;//书包的品牌privateintsize;//书包的尺寸//getter、setter略publicSchoo... 查看详情

$.extend()的深拷贝和浅拷贝详细讲解

版权声明:作者原创,转载请注明出处!语法:jQuery.extend([deep],target,object1[,objectN])描述: 将两个或更多对象的内容合并到第一个对象。关于$.extend()的用法网上有很多文章,在这里指向写写对深浅拷贝的理解深浅拷贝对应的参... 查看详情

c++中的深拷贝和浅拷贝的案例对比理解(代码片段)

用两个案例对比来理解为什么要深拷贝和浅拷贝案例一#include<iostream>usingnamespacestd;/*简单说浅拷贝就是赋值操作:深拷贝就是在堆区间又申请了一个空间,进行拷贝操作*/classPerpublic: int*name;public: Per(intn) name=newint(n... 查看详情

javascript深拷贝和浅拷贝数组(代码片段)

javascript分原始类型与引用类型(与java、c#类似)。Array是引用类型,直接用“=”号赋值的话,只是把源数组的地址(或叫指针)赋值给目的数组,并没有实现数组的数据的拷贝。这种方式的实现属于浅拷贝。... 查看详情