一般來講深複製主要是為了複製js對象中的引用類型,引用類型在普通的賦值操作下相當於是引用,修改複製對象也會影響原對象,簡單的方法的話可以使用JSON.parse(JSON.stringify(obj)) 來實現深複製 然而這是沒有考慮對象中有函數的情況,用var b = JSON.parse(JSO ...
一般來講深複製主要是為了複製js對象中的引用類型,引用類型在普通的賦值操作下相當於是引用,修改複製對象也會影響原對象,簡單的方法的話可以使用JSON.parse(JSON.stringify(obj)) 來實現深複製
然而這是沒有考慮對象中有函數的情況,用var b = JSON.parse(JSON.stringify(a)) 這種方法的深複製沒法複製對象裡面的函數,而且屬性的順序也可能會出錯。
這裡記錄一下用遞歸深複製可以複製函數的辦法
function isArray(o){ return Object.prototype.toString.call(o)=='[object Array]'; } function deepCopy(obj){ var newObj ; if(isArray(obj)){ newObj = [] ; }else if(typeof obj=="object"){ newObj = {} ; }else if(typeof obj=="function"){ return eval(obj.toString()) }else{ return obj ; } for(var key in obj){ newObj[key] = arguments.callee(obj[key]) ; } return newObj ; }
其實函數的複製可以用eval(fun.otStrng())這樣,加上對對象的判別,就完成里一個obj中有函數或者引用類型的複製。
註:es6中其實已經有isArray這個函數了,用法是Array.isArray(yourArr),返回一個bool值