<!doctype html><html lang="en"> <head> <meta charset="gbk" /> <meta content="IE=8" http-equiv="X-UA-Compatible"/> <title>javascript 深拷贝</title> <script type="text/javascript"> var oOriginal = { memNum: 1, // number memStr: "I am a string", // string memObj: { test1: "Old value" // we’ll test }, memArr: [ // array "a string", // string member of array { // object member of array test2: "Try changing me" // we'll test } ] }; var extend = function(result, source) { for (var key in source) result[key] = source[key]; return result; } var oCopy = extend({},oOriginal); // 浅拷贝 oCopy.memObj.test1 = "New value"; // 出现问题了,会反射到原对象上 console.log(oOriginal.memObj.test1); // 结果副本与原本都一同被修改了 oCopy.memArr[1].test2 = "I am changed"; console.log(oOriginal.memArr[1].test2); // 同样中招了 </script> </head> <body> <h1>javascript 浅拷贝</h1> </body></html>
深拷贝 实例
<!doctype html><html lang="en"> <head> <meta charset="gbk" /> <meta content="IE=8" http-equiv="X-UA-Compatible"/> <title>javascript 深拷贝 </title> <script type="text/javascript"> var oOriginal = { memNum: 1, // number memStr: "I am a string", // string memObj: { test1: "Old value" // we’ll test }, memArr: [ // array "a string", // string member of array { // object member of array test2: "Try changing me" // we'll test } ] }; dom = {}; dom.is = function (obj,type) { return (Object.prototype.toString.call(obj).slice(8,-1)===type) }; dom.deepCopy = function(result, source){ for(var key in source){ var value = source[key]; if(value===source) continue; if(dom.is(value,"Object")){result[key] = arguments.callee(result[key] || {},value); }else if(dom.is(value, "Array")){ result[key] = arguments.callee(result[key] || [],value) }else{ result[key] = value; } }return result; }; var oCopy = dom.deepCopy({},oOriginal); oCopy.memObj.test1 = "New value"; console.log(oOriginal.memObj.test1); oCopy.memArr[1].test2 = "I am changed"; console.log(oOriginal.memArr[1].test2); </script> </head> <body> <h1>javascript 深拷贝</h1> </body></html>