js有两种数据类型:
基本类型(包括undefined,Null,boolean,String,Number),按值传递;
引用类型(包括Array,Object),按址传递,引用类型在值传递的时候是内存中的地址。
克隆或者拷贝分为2种:
浅度克隆:基本类型为值传递,对象仍为引用传递。
1 var oPerson={ 2 oName:"rookiebob", 3 oAge:"18", 4 oAddress:{ 5 province:"beijing" 6 }, 7 ofavorite:[ 8 "swimming", 9 {reading:"history book"} 10 ], 11 skill:function(){ 12 console.log("bob is coding"); 13 } 14 }; 15 function clone(obj){ 16 var result={}; 17 for(key in obj){ 18 result[key]=obj[key]; 19 } 20 return result; 21 } 22 var oNew=clone(oPerson); 23 console.log(oPerson.oAddress.province);//beijing 24 oNew.oAddress.province="shanghai"; 25 console.log(oPerson.oAddress.province);//shanghai
深度克隆:所有元素或属性均完全克隆,并于原引用类型完全独立。即,在后面修改对象的属性的时候,原对象不会被修改。
1 function deepClone(obj){ 2 var result,oClass=isClass(obj); 3 //确定result的类型 4 if(oClass==="Object"){ 5 result={}; 6 }else if(oClass==="Array"){ 7 result=[]; 8 }else{ 9 return obj;//此处如果用return result=obj;会大幅增加时间复杂度 10 } 11 for(key in obj){ 12 var copy=obj[key]; 13 if(isClass(copy)=="Object"){ 14 result[key]=arguments.callee(copy);//递归调用 15 }else if(isClass(copy)=="Array"){ 16 result[key]=arguments.callee(copy); 17 }else{ 18 result[key]=obj[key]; 19 } 20 } 21 return result; 22 } 23 //返回传递给他的任意对象的类 24 function isClass(o){ 25 if(o===null) return "Null"; 26 if(o===undefined) return "Undefined"; 27 return Object.prototype.toString.call(o).slice(8,-1);//返回"[object type]"数组故需从数组第8个元素到最后一个元素截取“type”部分内容 28 } 29 var oPerson={ 30 oName:"rookiebob", 31 oAge:"18", 32 oAddress:{ 33 province:"beijing" 34 }, 35 ofavorite:[ 36 "swimming", 37 {reading:"history book"} 38 ], 39 skill:function(){ 40 console.log("bob is coding"); 41 } 42 }; 43 //深度克隆一个对象 44 var oNew=deepClone(oPerson); 45 46 oNew.ofavorite[1].reading="picture"; 47 console.log(oNew.ofavorite[1].reading);//picture 48 console.log(oPerson.ofavorite[1].reading);//history book 49 50 oNew.oAddress.province="shanghai"; 51 console.log(oPerson.oAddress.province);//beijing 52 console.log(oNew.oAddress.province);//shanghai
时间: 2025-01-08 14:11:00