轉:http://www.cnblogs.com/wangzhichao/archive/2013/04/11/3014419.html html
方案一:利用現代瀏覽器支持的JSON對象作一次中轉,實現深度克隆。(IE六、IE7不支持原生JSON對象,可載入json2.js補丁來達到兼容)感謝rekey提供此方案。JSON.stringify()與JSON.parse()詳細信息請點擊這裏 git
var deepClone = function (obj) { var _tmp,result; _tmp = JSON.stringify(obj); result = JSON.parse(_tmp); return result; } var obj1 = {family:{brother:"wangzhipeng",father:"wanglicai",mother:"sunaiyun"},name:"gino",sex:"male",age:"27"}; var obj2 = deepClone(obj1); obj1.family.brother = "close"; console.log(obj1); console.log(obj2);
方案二:肯定參數類型爲object (這裏僅指object literal、Array literal)後,複製源對象的鍵/值到目標對象,不然直接返回源對象。 github
注:下面這個函數只能說基本知足生產需求,若是參數是Dom對象、new Object ()的話,就會產生功能性錯誤,要兼容參數的全部數據類型,請參考:http://stackoverflow.com/a/4460624/2109599 json
var deepClone = function fnDeepClone(obj){ var result = typeof obj.splice === 'function'?[]:{}, key; if (obj && typeof obj === 'object'){ for (key in obj ){ if (obj[key] && typeof obj[key] === 'object'){ result[key] = fnDeepClone(obj[key]);//若是對象的屬性值爲object的時候,遞歸調用deepClone,即再把某個值對象複製一份到新的對象的對應值中 }else{ result[key] = obj[key];//若是對象的屬性值不爲object的時候,直接複製參數對象的每個鍵/值到新對象對應的鍵/值中 } } return result; } return obj; } //test array var arry1= ["a","b","c","d"]; var arry2 = deepClone(arry1); arry1.pop(); console.log(arry1); console.log(arry2); //test object var obj1 = {name:"gino",sex:"male",age:27,favorite:"pingpang",family:{brother:"zhipeng",mother:"SunAiyun",father:"WangLicai"}}; var obj2 = deepClone(obj1); obj1.family.brother = "close"; console.log(obj1); console.log(obj2);
方案三:利用數組的Array.prototype.forEach和其餘一些ECMAScript 5中的Object.*函數。經測試,當值的類型爲object的時候,會出現功能錯誤。我的水平有限,沒看懂這個函數,若有朋友能幫忙修正下此函數,萬分感激。 連接 數組
var deepClone = function (o){ var copy = Object.create( Object.getPrototypeOf(o) ); var propNames = Object.getOwnPropertyNames(o); propNames.forEach(function(name){ var desc = Object.getOwnPropertyDescriptor(o, name); Object.defineProperty(copy, name, desc); }); return copy; } var obj1 = {family:{brother:"wangzhipeng",father:"wanglicai",mother:"sunaiyun"},name:"gino",sex:"male",age:"27"}; var obj2 = deepClone(obj1); obj1.sex = "close"; console.log(obj1); console.log(obj2);