關於對象的深拷貝一直是你們津津樂道一個話題,本騷年經過研究(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"}
因此若是對象值中有這哥仨的話就要採用別的方法了,好比本身寫個函數什麼的搞定,好比這樣。spa
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()這些,這些只深複製了基本類型數據類型,不是真正意義的深複製,固然,若是要複製的對象或者數組都是簡單數據類型,那就大膽用吧。code
所謂方法,沒有最優,只有最合適的,因此選擇最合適的就ok啦。對象