一.数组的深浅拷贝
在使用JavaScript对数组进行操作的时候,我们经常需要将数组进行备份,事实证明如果只是简单的将它赋予其他变量,那么我们只要更改其中的任何一个,然后其他的也会跟着改变,这就导致了问题的发生。
var arr = ["One","Two","Three"]; var arrto = arr; arrto[1] = "test"; document.writeln("数组的原始值:" + arr + "<br />");//Export:数组的原始值:One,test,Three document.writeln("数组的新值:" + arrto + "<br />");//Export:数组的新值:One,test,Three
像上面的这种直接赋值的方式就是浅拷贝,很多时候,这样并不是我们想要得到的结果,其实我们想要的是arr的值不变,不是吗?
方法一:js的slice函数
对于array对象的slice函数,返回一个数组的一段。(仍为数组)
语法:arrayObj.slice(start, [end])
参数arrayObj:必选项。一个 Array 对象。
start:必选项。arrayObj 中所指定的部分的开始元素是从零开始计算的下标。
end:可选项。arrayObj 中所指定的部分的结束元素是从零开始计算的下标。
说明:
slice 方法返回一个 Array 对象,其中包含了 arrayObj 的指定部分。
slice 方法一直复制到 end 所指定的元素,但是不包括该元素。如果 start 为负,将它作为 length + start处理,此处 length 为数组的长度。如果 end 为负,就将它作为 length + end 处理,此处 length 为数组的长度。如果省略 end ,那么 slice 方法将一直复制到 arrayObj 的结尾。如果 end 出现在 start 之前,不复制任何元素到新数组中。
var arr = ["One","Two","Three"]; var arrtoo = arr.slice(0); arrtoo[1] = "set Map"; document.writeln("数组的原始值:" + arr + "<br />");//Export:数组的原始值:One,Two,Three document.writeln("数组的新值:" + arrtoo + "<br />");//Export:数组的新值:One,set Map,Three
方法二:js的concat方法
concat() 方法用于连接两个或多个数组。该方法不会改变现有的数组,而仅仅会返回被连接数组的一个副本。
语法:arrayObject.concat(arrayX,arrayX,......,arrayX)
说明:返回一个新的数组。该数组是通过把所有 arrayX 参数添加到 arrayObject 中生成的。如果要进行 concat() 操作的参数是数组,那么添加的是数组中的元素,而不是数组。
var arr = ["One","Two","Three"]; var arrtooo = arr.concat(); arrtooo[1] = "set Map To"; document.writeln("数组的原始值:" + arr + "<br />");//Export:数组的原始值:One,Two,Three document.writeln("数组的新值:" + arrtooo + "<br />");//Export:数组的新值:One,set Map To,Three
实例1:
实例2:
二.对象的深浅拷贝
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}
就是把对象的属性遍历一遍,赋给一个新的对象。
var deepCopy= function(source) { var result={}; for (var key in source) { result[key] = typeof source[key]==='object'? deepCopy(source[key]): source[key]; } return result; }
实例1:
实例2:
当然,如果有引用JQuery库,那么可以用jQuery.extend(true, {}, oldObject);,具体可参考http://bijian1013.iteye.com/blog/2255037。
文章来源:http://www.cnblogs.com/yichengbo/archive/2014/07/10/3835882.html
相关推荐
js中的浅拷贝和深拷贝,只是针对复杂数据类型(Objcet,Array)的复制问题。简单来讲浅拷贝和深拷贝都可以实现在原有对象的基础上再生成一份的作用。但是根据新生成的对象能否影响到原对象可以分为浅拷贝和深拷贝。 ...
JS 深拷贝与浅拷贝详解以及例子 ...浅拷贝和深拷贝都是 JavaScript 开发中常见的概念,但它们的实现方法和应用场景不同。浅拷贝适用于只需要拷贝一层的数据,而深拷贝适用于需要完全拷贝整个数据结构的场景。
本文将详细探讨JavaScript中的深拷贝和浅拷贝,包括它们的定义、实现方法以及在不同场景下的应用。 深拷贝和浅拷贝是JavaScript中处理对象和数组复制的两种基本方法。选择使用哪一种取决于具体的需求和场景。浅拷贝...
JavaScript中的深拷贝和浅拷贝是编程面试中常见的概念,尤其在处理对象和数组时至关重要。它们主要涉及的是变量赋值时数据的复制方式。简单来说,浅拷贝是创建了一个新对象,但它的属性仍然是对原对象属性的引用,而...
当我们谈论深拷贝和浅拷贝时,这是针对对象复制而言的。浅拷贝仅仅复制对象的引用,而深拷贝则是创建一个全新的对象,包含所有原始对象的属性值,并且如果属性是复杂类型(即引用类型),也会递归地复制其内部属性。...
在编程领域,尤其是在使用像JavaScript、Python这样的动态类型语言时,深拷贝和浅拷贝是两个非常重要的概念。它们涉及到对象复制的过程,对于理解和解决内存管理、数据修改等问题至关重要。下面将详细解释这两个概念...
在JavaScript中,深拷贝和浅拷贝是两种不同的复制对象或数组的方式,它们在处理复杂数据结构时尤其重要,因为它们决定了原数据和副本之间的关联关系。本文将详细解释这两种拷贝的区别以及如何实现它们。 **一、数组...
首先,我们来看JavaScript中的深拷贝和浅拷贝。在JavaScript中,对象的浅拷贝是通过简单的引用复制实现的。这意味着当一个对象被浅拷贝后,新旧对象共享同一块内存。如果原始对象的属性被修改,这种修改会影响到拷贝...
在JavaScript中,数组的深拷贝是一个常见的需求,它涉及到数据结构的复制,尤其是在处理复杂对象和嵌套数据时。深拷贝与浅拷贝不同,浅拷贝只是复制引用,而深拷贝会创建一个新的对象,包含原始数组的所有元素,并...
在JavaScript编程中,深拷贝和浅拷贝是两种常见的数据复制方法。深拷贝创建了一个新对象,这个新对象复制了原始对象的所有属性,并且这些属性的值都是原始对象属性值的副本,包括嵌套的对象和数组。这意味着对深拷贝...
前端面试相关-深拷贝和浅拷贝的实现方法和区别
JavaScript中的对象拷贝是编程中... 总之,理解JavaScript中的浅拷贝和深拷贝非常重要,因为它们直接影响到对象的复制行为和数据的独立性。在实际开发中,选择适当的拷贝策略可以避免意外的副作用,确保程序的正确性。
JavaScript中的深拷贝和浅拷贝是编程中常见的概念,主要涉及到对象和数组的复制。在JavaScript中,数据类型分为基本数据类型(如Number、String、Boolean等)和引用数据类型(如Object、Array等)。基本类型直接存储...
浅拷贝和深拷贝各有适用场景。浅拷贝适用于只需复制对象第一层属性且不涉及修改引用类型属性的场景,而深拷贝适用于需要完全独立的数据副本,尤其是处理嵌套对象或数组时。在选择拷贝方法时,应根据实际需求和性能...
本文实例讲述了JS赋值、浅拷贝和深拷贝(数组和对象的深浅拷贝)。分享给大家供大家参考,具体如下: 深拷贝和浅拷贝是只针对Object和Array这样的引用数据类型的。 浅拷贝 只是拷贝了基本类型的数据,而引用类型...
这篇博客“浅拷贝深拷贝之jQuery中的$.extend分析”深入探讨了`$.extend`在浅拷贝和深拷贝场景下的工作原理,这对于理解JavaScript对象的复制机制至关重要。 浅拷贝是指创建一个新对象,然后将源对象的引用属性复制...
JavaScript中的浅拷贝和深拷贝是两种不同的对象复制方式,它们在处理复杂对象时有着显著的区别。在JavaScript中,对象是引用类型,因此当一个对象被复制时,如果不进行特殊处理,复制的只是指向原对象的引用,而非...
目录 一、概念 1、浅拷贝 2、深拷贝 ...JavaScript中的数据分为基本类型和引用类型,一般基本类型的数据占用内存大小确定,保存于栈中;引用类型的数据由于在创建之初数据占用内存的大小不确定,但是保
深入了解JavaScript中的浅拷贝和深拷贝