關於對象的深拷貝一直是大家津津樂道一個話題,本騷年通過研究(yuedu)發現還是很easy的。
首推的方法簡單有效,JSON.stringfy()和JSON.parse()即可搞定。但是這種簡單粗暴的方法有其局限性。當值為undefined
、function
、symbol
會在轉換過程中被忽略。。。所以,對象值有這三種的話用這種方法會導致屬性丟失。
var syb = Symbol('obj'); var person = { name :'tino', say: function(){ console.log('hi'); }, ok: syb, un: undefined } var copy = JSON.parse(JSON.stringify(person)) // copy // {name: "tino"}
所以如果對象值中有這哥仨的話就要采用別的方法了,比如自己寫個函數什么的搞定,比如這樣。
function deepCopy(obj) { var result = Array.isArray(obj) ? [] : {}; for (var key in obj) { if (obj.hasOwnProperty(key)) { if (typeof obj[key] === 'object' && obj[key]!==null) { result[key] = deepCopy(obj[key]); //遞歸復制 } else { result[key] = obj[key]; } } } return result; }
還有一些Object.assgin(), 數組的slice()這些,這些只深復制了基本類型數據類型,不是真正意義的深復制,當然,如果要復制的對象或者數組都是簡單數據類型,那就大膽用吧。
所謂方法,沒有最優,只有最合適的,所以選擇最合適的就ok啦。