javascript中的克隆对象与copy的区别
2016-11-10 19:16
274 查看
javascript中的克隆对象与copy的区别
今天在项目中创建一个类似的## 标题 ##对象,可惜数据量太大,无论怎么操作,我指向的都是同一个对象,最后发现了一个问题,就是克隆与copy的区别。这次的项目从后台传出来的数据缺失,需要前端根据已有的数据来补充,这是我的项目中的数据:
我想在内存中创建一个对象和键为19的一系列内容相同,然后我用了copy:
function deepCopy(fathers, childs) { var childs = childs || {}; for (key in fathers) { if (fathers[key] instanceof Array) { childs[key] = []; //当copy的属性为数组 deepCopy(fathers[key], childs[key]); } else { childs[key] = {}; //当copy的属性为对象 childs[key] = fathers[key]; } } return childs; } for (var i=0; i<noDataIndex.length; i++) { for (key2 in data2Obj) { var tempArrs = deepCopy(data2Obj[key2]); //克隆一个类似对象 if (tempArrs) { break; } } console.log(**tempArrs**) for(key3 in tempArrs){ tempArrs[key3].Total = 0; } data2Obj[noDataIndex[i]] = tempArrs; }
随后发现,我copy出的tempArr和原来的对象指向同一个内存。然后我用了克隆的方法,然后就可以实现他们指向不同的内存了,以下是我的克隆方法,希望大家以后遇到可以用这个,比copy好用,如果非要问个具体原因,我想只有动手才能发现区别,我的项目太复杂,只有用到constructor才能清楚判断对象的构造函数来源是谁,而上面的方法不能清楚地判断:
方法一:
function clone2(father){ var child, father; if (father.constructor == Object){ child = new father.constructor(); }else{ //valueOf() 方法返回 Array 对象的原始值 child = new father.constructor(father.valueOf()); } for(var key in father){ if ( child[key] != father[key] ){ if ( typeof(father[key]) == 'object' ){ child[key] = clone2(father[key]); }else{ child[key] = father[key]; } } } child.toString = father.toString; child.valueOf = father.valueOf; return child; }
另外我再推荐几个常用的克隆方法:
方法二:
function clone(obj){ var o; switch(typeof obj){ case 'undefined': break; case 'string' : o = obj + '';break; case 'number' : o = obj - 0;break; case 'boolean' : o = obj;break; case 'object' : if(obj === null){ o = null; }else{ if(obj instanceof Array){ o = []; for(var i = 0, len = obj.length; i < len; i++){ o.push(clone(obj[i])); } }else{ o = {}; for(var k in obj){ o[k] = clone(obj[k]); } } } break; default: o = obj;break; } return o; }
方法三:
function clone3(obj){ function Clone(){} Clone.prototype = obj; var o = new Clone(); for(var a in o){ if(typeof o[a] == "object") { o[a] = clone3(o[a]); } } return o; }
相关文章推荐
- JavaScript 深度克隆 JSON 对象
- JavaScript 深度克隆 JSON 对象
- javascript的window.ActiveXObject对象,区别浏览器的方法
- JavaScript数据类型,类,对象/数组区别
- 【原】JavaScript中Date对象的getYear()和getFullYear()的区别
- javascript 克隆对象
- [javascript] IE与火狐下window.event对象的区别
- 【javascript基础】之【理解JavaScript函数(函数和对象的区别和联系)】
- javascript深度克隆一个对象
- 【javascript基础】之深度克隆(深度拷贝)一个对象
- JavaScript 深度克隆 JSON 对象
- JavaScript 对象方法 类方法 原型方法的区别;私有属性 公有属性 公有静态属性的区别
- JavaScript-Date对象中 getYear()与getFullYear()的区别
- JavaScript对象转换成JSON字符串及深度克隆方法
- java对象与JavaScript对象之间的区别
- PHP 对象的克隆(clone)与引用(=)的区别
- javascript对象和函数的区别
- 克隆javascript对象的三个方法小结
- javascript json文本与json对象的区别
- javascript克隆对象深度介绍