浅拷贝
所谓的浅拷贝就是拷贝指向对象的指针,意思就是说:拷贝出来的目标对象的指针和源对象的指针指向的内存空间是同一块空间.浅拷贝只是一种简单的拷贝,让几个对象公用一个内存,然而当内存销毁的时候,指向这个内存空间的所有指针需要重新定义,不然会造成指针错误
深拷贝
所谓的深拷贝指拷贝对象的具体内容,其内容地址是自助分配的,拷贝结束之后,内存中的值是完全相同的,但是内存地址是不一样的,两个对象之间相互不影响,也互不干涉.
在使用JavaScript对数组进行操作的时候,如果只是简单的将它赋予其他变量,那么我们只要更改其中的任何一个,然后其他的也会跟着改变,这就导致了问题的发生。
var arr = ['aa','bb','cc'];
var arr2 = arr;
arr2[0] = '新来的';
console.log(arr);//输出 '新来的','bb','cc'
由此可见对数组arr2进行修改时,而arr内数据也会随之改变。这种直接赋值的方式就是浅拷贝现象。 一般都是开辟一块新的内存地址,将原对象的各个属性逐个复制出去。
一、数组深拷贝
1、遍历
var a = [1,2,3];
var deepArry = [];
function deepCopy(arry1, arry2){
for(var i = 0,l= arry1.length;i<l;i++){
arry2[i] = arry1[i];
}
}
deepCopy(a,deepArry);
console.log(a);
console.log(deepArry);
2、slice方法
var arr = ["One","Two","Three"];
var arr_2= arr.slice(0);
console.log(arr_2 )
3、concat方法
var arr = ["One","Two","Three"];
var arr_2= arr.concat();
console.log(arr_2);
注:Array的slice和concat方法
Array的slice和concat方法不修改原数组,只会返回一个浅复制了原数组中的元素的一个新数组。之所以把它放在深拷贝里,是因为它看起来像是深拷贝。而实际上它是浅拷贝。原数组的元素会按照下述规则拷贝:
如果该元素是个对象引用 (不是实际的对象),slice 会拷贝这个对象引用到新的数组里。两个对象引用都引用了同一个对象。如果被引用的对象发生改变,则新的和原来的数组中的这个元素也会发生改变。
对于字符串、数字及布尔值来说(不是 String、Number 或者 Boolean 对象),slice 会拷贝这些值到新的数组里。在别的数组里修改这些字符串或数字或是布尔值,将不会影响另一个数组。
如果向两个数组任一中添加了新元素,则另一个不会受到影响。例子如下:
var array = [1,2,3]; var array_shallow = array; var array_concat = array.concat(); var array_slice = array.slice(0); console.log(array === array_shallow); //true console.log(array === array_slice); //false,“看起来”像深拷贝 console.log(array === array_concat); //false,“看起来”像深拷贝
可以看出,concat和slice返回的不同的数组实例,这与直接的引用复制是不同的。而从另一个例子可以看出Array的concat和slice并不是真正的深复制,数组中的对象元素(Object,Array等)只是复制了引用。如下:
var array = [1, [1,2,3], {name:"array"}]; var array_concat = array.concat(); var array_slice = array.slice(0); array_concat[1][0] = 5; //改变array_concat中数组元素的值 console.log(array[1]); //[5,2,3] console.log(array_slice[1]); //[5,2,3] array_slice[2].name = "array_slice"; //改变array_slice中对象元素的值 console.log(array[2].name); //array_slice console.log(array_concat[2].name); //array_slice
二、对象深拷贝
var a={name:'yy',age:26};
var b=new Object();
b.name=a.name;
b.age=a.age;
a.name='xx';
console.log(b);//Object { name="yy", age=26}
console.log(a);//Object { name="xx", age=26}
1、json方法
var obj= {a:1,b:2};
var str = JSON.stringify(obj);//这里将json内的数据转换成一个字符串存起来
var obj_2= JSON.parse(str);//这里将字符串的内容"还原"成原来的"面目"
console.log(obj_2);//输出 {a:1,b:2}
相关推荐
深拷贝和浅拷贝一些例子
接下来,我们详细探讨浅拷贝和深拷贝的区别、问题所在以及如何解决。 首先,浅拷贝是指在对象复制过程中,只是简单地复制了对象的指针,而没有复制指针所指向的数据。在浅拷贝的情况下,多个对象可能会指向同一块...
对于不可变类型(如整数、字符串、元组),浅拷贝和深拷贝没有实质区别,因为这些类型不可变,所以拷贝后的新对象和原对象是等价的,但不一定是同一对象(即`is`操作符可能返回`False`)。 总之,深拷贝和浅拷贝的...
在编程领域,尤其是在使用像JavaScript、Python这样的动态类型语言时,深拷贝和浅拷贝是两个非常重要的概念。它们涉及到对象复制的过程,对于理解和解决内存管理、数据修改等问题至关重要。下面将详细解释这两个概念...
JavaScript中的深拷贝和浅拷贝是编程面试中常见的概念,尤其在处理对象和数组时至关重要。它们主要涉及的是变量赋值时数据的复制方式。简单来说,浅拷贝是创建了一个新对象,但它的属性仍然是对原对象属性的引用,而...
【ASP.NET编程知识】浅谈.NET平台下深拷贝和浅拷贝 在.NET平台下,对象拷贝是一个常见的操作,主要分为两种类型:浅拷贝(Shallow Copy)和深拷贝(Deep Copy)。这两种拷贝方式在处理对象复制时有着显著的区别,对...
当我们谈论深拷贝和浅拷贝时,这是针对对象复制而言的。浅拷贝仅仅复制对象的引用,而深拷贝则是创建一个全新的对象,包含所有原始对象的属性值,并且如果属性是复杂类型(即引用类型),也会递归地复制其内部属性。...
在给出的例子中,我们有两个测试类`Test2`和`Test3`,分别演示了浅拷贝和深拷贝的效果。 - 在`Test2`中,通过简单赋值创建了一个新的`Test`对象`t2`,这是浅拷贝。当修改`t2`的属性时,`t1`的属性也会随之改变,...
在Python编程语言中,"copy"模块提供了对对象复制的...了解深拷贝和浅拷贝的概念后,开发者可以根据具体需求选择合适的方法。在实际编程中,结合使用`copy`模块和`deepcopy`函数,可以更有效地管理内存和数据的独立性。
前端面试相关-深拷贝和浅拷贝的实现方法和区别
js中的浅拷贝和深拷贝,只是针对复杂数据类型(Objcet,Array)的复制问题。简单来讲浅拷贝和深拷贝都可以实现在原有对象的基础上再生成一份的作用。但是根据新生成的对象能否影响到原对象可以分为浅拷贝和深拷贝。 ...
当我们复制一个对象时,有两种主要的方法:浅拷贝和深拷贝。 2. **浅拷贝(浅复制)** 浅拷贝是指创建一个新对象,然后将原对象的引用字段的值复制到新对象中。这意味着新旧两个对象指向相同的内存区域。如果原...
1、只有NS类型调用copy方法才是浅拷贝,其他的情况全是深拷贝 2、容器类调用copy或mutableCopy能出现的深拷贝的情况下,只是容器的深拷贝,而非容器内元素的深拷贝 3、无论是声明NSString还是NSMutableString类型的...
在iOS开发中,深拷贝和浅拷贝是两个关键概念,它们涉及到对象复制时内存管理的细节。本文将从源码角度深入解析这两种拷贝方式。 首先,我们需要明确深拷贝和浅拷贝的基本定义。浅拷贝,也称为指针拷贝,意味着拷贝...
然而,复制行为可以根据对象内部属性的引用方式被区分为深拷贝和浅拷贝。理解这两者之间的区别对于编写正确和高效的代码至关重要。本文将详细探讨JavaScript中的深拷贝和浅拷贝,包括它们的定义、实现方法以及在不同...
Java Clone 深拷贝与浅拷贝的两种实现方法 Java Clone 是 Java 语言中的一种复制对象的机制,它可以将一个对象的所有属性和状态复制到另一个对象中,实现对象的深拷贝和浅拷贝。下面我们将讨论 Java 中的深拷贝和浅...
深拷贝和浅拷贝的选择取决于数据结构的特性以及应用场景的需求。了解深拷贝与浅拷贝的工作原理对于编写高效可靠的代码至关重要。同时,熟悉堆与栈的概念有助于更好地理解和优化程序的内存使用情况。在实际开发过程中...