javascript物件深度克隆探索
說到js裡的物件克隆,首先要了解js裡的資料型別有哪些:
1、number string boolean null undefined 基本型別,也叫原始型別
2、object array function 引用型別
對於以上兩種資料型別的克隆不相同,對於原始型別,我們可以直接用等號賦值克隆,而對於引用型別,由於實際內容存放在記憶體中,不能直接用等號賦值克隆(如果這樣賦值,那兩個物件其實指向記憶體中的同一地址)
在完成深度克隆的方法之前,我們還需瞭解js中判斷物件是哪種基本型別的方法,
我這裡採用Object.prototype.toString.call()的方法:
function getObjClass(obj) { return Object.prototype.toString.call(obj).slice(8, -1); }
function deepClone(obj) { var result; var objClass = getObjClass(obj);
//避免返回錯誤的型別 if(objClass == 'Object') { result = {}; } else if(objClass == 'Array') { result = []; } else { return obj; //基本型別的物件直接淺拷貝完成 } for(key in obj) { var o = obj[key]; var oClass = getObjClass(o); if(oClass == "Object"||oClass == "Array") { result[key] = arguments.callee(o); //遞迴呼叫 }else { result[key] = o; } } return result; }