由于js是采用引用传值的,故修改任何一个对象,其关联的对象也会被改变,但很多时候我们只想得到一个对象的拷贝,而非引用。下面提供了一种实现。不过除非程序中需要,否则要避免操作对象的拷贝,因为这样会影响性能,造成太多的递归调用(too much recursive)。
function clone(o) {
if (!o) {
return o;
} else {
var c;
if (Object.prototype.toString.apply(o) === '[object Array]') {
c = [];
for (var i = 0; i < o.length; i++) {
c.push(clone(o[i]));
}
// 采用这种判断,而非typeof(o) === 'object',这里只处理Object,而不处理其他包括Array、String、Date、Function等,但由new创建的Function对象的也是Object
} else if (Object.prototype.toString.call(o) === '[object Object]') {
c = {};
for (var p in o) {
c[p] = clone(o[p]);
}
} else {
return o;
}
return c;
}
}
该方法当对象中有大量的数据时,进行深拷贝会进行大量的递归,这样可能会造成程序不能运行下去,所以尽量避免使用。如果必须使用时首先得确保被拷贝的对象不是很大。
另外对于数组,如果数组中的元素是数字型或是字符型的,可以调用concat来简单的完成数组的复制
var arr1 = [12,34,56];
var arr3 = [].concat(arr1);
arr1.push(77);//arr1改变
alert(arr1);//12,34,56,77
alert(arr3);//12,34,56说明arr1和arr3不是指向同一个对象
var arr2 = [23,45,67];
arr3 = [].concat(arr1,arr2);//多个数组的复制
alert(arr1);
alert(arr2);
alert(arr3);
通过运行以上代码,可以看出调用concat后,重新创建了一个对象。这里需要注意的,对于从正被连接到新数组的数组中复制的是对象参数,复制后仍然指向相同的对象。不论新数组和源数组中哪一个有改变,都将引起另一个的改变。
分享到:
相关推荐
这里我们将详细讨论三种克隆JavaScript对象的方法。 ### 方法一:递归深度复制 ```javascript function clone(obj) { var o; switch (typeof obj) { case 'undefined': break; case 'string': o = obj + '';...
JavaScript中的浅层克隆与深度克隆是两种不同的对象复制方式,它们主要处理对象和数组这类引用类型的数据。这两种克隆方法的区别在于处理对象内部引用值的方式,即对堆内存中对象的复制程度。 1. **浅层克隆**: ...
总的来说,JavaScript对象的深度克隆对于保持数据的独立性和防止意外修改至关重要,尤其是在处理复杂的组件状态或需要持久化数据时。开发者可以根据项目需求和浏览器兼容性选择合适的深度克隆实现方式。
在JavaScript编程中,扩展类、克隆对象以及混合类是经常会用到的技术,它们各自有其特定的用途和实现方式。 首先我们来探讨“JS扩展类”。在JavaScript中,没有传统意义上的类继承机制,但可以通过原型链...
在HTML和JavaScript的世界里,...总之,"htmljs克隆标签"是一个重要的前端开发技巧,它提供了动态更新页面内容的能力,让网页更具交互性和灵活性。通过熟练掌握这一技能,开发者能够更高效地构建复杂的Web应用程序。
虽然这种方法简单,但它不能处理所有类型的JavaScript对象。例如,日期对象、正则表达式、函数、`undefined`值等将丢失或转换为其他值。 在提供的示例中,这两种方法都被用来创建`schedule`对象的深副本,并在副本...
标题提到的"一个用于对象深度克隆的同构和可配置javascript函数"是指一个能够在浏览器环境和Node.js环境中通用(同构)的JavaScript函数,它提供了一种灵活的方式来深度复制复杂的数据结构,同时允许用户根据需求...
标题提到的"nanoclone"是一个极简的JavaScript库,其核心代码只有145字节,但能实现深度克隆功能。这在追求轻量级解决方案的场景下显得尤为宝贵。 在JavaScript中,有多种实现深拷贝的方法。例如,可以使用JSON的...
在JavaScript的世界里,数据操作是开发过程中的常见任务,特别是在处理复杂对象时,克隆对象的需求尤为突出。"rfdc"(Real Fast Deep Clone)是一个专门为JavaScript设计的深层克隆库,正如其名,它提供了高效且精确...
在讨论JavaScript对象克隆的实现与技巧时,我们首先需要了解对象克隆的概念和它在编程中的应用。对象克隆指的是创建一个具有与原始对象相同属性和值的新对象,但两个对象是独立的,即对新对象的任何修改都不会影响...
DOM节点克隆是JavaScript中一个重要的概念,它允许我们创建现有DOM节点的副本,这对于数据备份、重复元素或者创建复杂动态效果非常有用。本文将详细介绍JavaScript中的DOM节点克隆,包括浅复制和深复制的区别。 一...
JavaScript中的对象克隆,尤其是深层克隆,是一个重要的概念,主要用在数据处理和状态管理中,以确保复制的对象与原对象独立,互不影响。在JavaScript中,对象是引用类型,意味着当你创建一个对象并赋值给另一个变量...
在前端开发中,处理JavaScript对象和数组的克隆是一个常见的需求。克隆对象或数组可以让我们对它们进行操作,而不影响原始数据。本文将介绍几种在JavaScript中常用的对象和数组克隆方法,并讨论在涉及iframe父子窗口...
JavaScript中的对象克隆是一个重要的概念,特别是在处理复杂的数据结构时,比如对象和数组。对象克隆可以帮助我们创建对象的一个副本,这个副本与原始对象独立,修改副本不会影响原始对象。 在JavaScript中,有两种...
本文档是解决 引用问题的解决方案,它不仅可以解决引用值拷贝 ,还可以原样复制一个一摸一样的数组、对象包括其中的方法。
JavaScript对象的深度克隆是一种创建一个全新对象的过程,这个新对象与原始对象具有相同的数据结构,包括嵌套的对象和数组,但所有数据都是独立的副本,不会因为原对象的修改而受到影响。在JavaScript中,浅克隆只...