由于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对象的三个方法整理,需要的朋友可以参考下。
主要介绍了JS对象深度克隆,结合实例形式分析了JavaScript对象深度克隆的实现方法与相关注意事项,需要的朋友可以参考下
主要介绍了JS对象的深度克隆方法,结合实例形式分析了JavaScript深度克隆的实现技巧,需要的朋友可以参考下
nanoclone - 只有145B实现深度克隆JavaScript对象
JavaScript 深层克隆对象 今天做项目,有个需求需要用到深层克隆对象,并且要求在原型链上编程 于是心血来潮索性来复习一下这个知识点,在网上找了相应的知识, 克隆对象,这名词看着高大上,其实也没什么,便是拷贝...
一个用于对象深度克隆的同构和可配置javascript函数
本文档是解决 引用问题的解决方案,它不仅可以解决引用值拷贝 ,还可以原样复制一个一摸一样的数组、对象包括其中的方法。
深度克隆JavaScript对象(包括其直接原型),而不会无意间从全局原型中复制方法和值。 还可以在新创建的对象中复制循环关系。 安装 npm install smartclone 用法 var smartClone = require ( "smartclone" ) ; var...
对象克隆ES5的深克隆和比较概要// just for conveniencevar log = function ( ) { console . log . apply ( console , [ ] . slice . call ( arguments ) ) } ; var src = { name : 'dankogai' , lang : [ 'perl' ] ...
JavaScript作为一个基于对象(没有类的概念)的语言,从入门到精通到放弃一直会被对象这个问题围绕。 平时发的文章基本都是开发中遇到的问题和对最佳解决方案的探讨,终于忍不住要写一篇基础概念类的文章了。 本文探讨...
主要介绍了JavaScript对象之深度克隆介绍,本文详细的讲解了什么是对象深度克隆,并给出了示例代码,需要的朋友可以参考下
Ext的两种克隆的方法: 可以克隆对象、数据等:var newJson = Ext.clone(json); 只能克隆数组:var newJson = Ext.Array.clone(json); JQuery的方法: 深复制【可以迭代】:var newJson = jQuery.extend(true,{}, ...
深度克隆:所有元素或属性均完全克隆,并于原引用类型完全独立,即,在后面修改对象的属性的时候,原对象不会被修改。 代码如下: function cloneObject(obj){ var o = obj.constructor === Array ? [] : {}; for...
主要介绍了Javascript对象Clone用法,实例分析了javascript对象克隆的相关技巧,需要的朋友可以参考下
惰性深克隆,高性能的js克隆 传统的深拷贝做法 JSON.parse(JSON.stringify(data)) 递归浅拷贝 第一种做法存在一些局限,很多情况下并不能使用,因此这里就不提了;第二种做法一般是工具库中的深拷贝函数实现方式,...