javascript 中对象深拷贝
在看到jq.extend 时发现javascript 中的深拷贝,一直没有详细了解深拷贝怎么实现的。
1 var isType = function(obj, type){ 2 var toString = Object.prototype.toString, undefined; 3 return (obj === null && type === "Null") || (obj === undefined && type ==="Undefined") || 4 ( toString.call(obj).slice(8,-1) === type); 5 }; 6 //类型判断,如果是对象,或者是数组 toString 返回的是[object Object] [object Array] 7 8 var deepCopy = function(result, source){ 9 for(var key in source){ 10 11 var copy = source[key]; 12 if(source === source[key]) continue; //如window.window === window这种情况 13 if(isType(copy,"Object")){// copy Object 14 result[key] = arguments.callee(result[key] || {}, copy); 15 }else if(isType(copy, "Array")){// copy Array 16 result[key] = arguments.callee(result[key] || [], copy); 17 }else{// 字符串,数字等 18 result[key] = copy; 19 } 20 } 21 return result; 22 }; 23 24 var original = { 25 memNum:1, 26 memStr:"this is a string", 27 memObj:{ 28 test1: "object in object" 29 }, 30 memArr:[ 31 "this is another string", 32 { 33 test2:" object in array" 34 } 35 ] 36 }; 37 38 var copy = deepCopy({},original); 39 copy.memObj.test1="object in copy object"; 40 41 console.log(original.memObj.test1); //object in object 42 console.log(copy.memObj.test1); //object in copy object 43 //从这里看出,深拷贝了对象original ,在改变新对象的属性时,原对象的属性未受到影响
实现关键:如果对象的某一个属性是对象或者数组,那么要递归拷贝一遍,直到最终属性为string ,number。 这样在改变新对象上的属性就不会影响到原对象。
javascript 对象深拷贝
时间: 2024-10-25 11:49:44