2015-11-19 77 views
3
dst = { "a" : 1} 
src = { "edf" : {"zyx" : "right"}} 
Object.assign(dst, src) 
src.edf.zyx = "wrong" 
console.log(dst["edf"]["zyx"]) 

我希望看到'right'作爲輸出,但它打印'wrong'Ecma6,Object.assign不做深副本

這意味着,Object.assign尚未完成從源到目標的複雜對象的深層複製。我如何做深層複製?

注:我知道lodash.deepClone,但我想避免外界構架

+4

呀' Object.assign()'只執行屬性的淺層合併。但是,目前沒有深度合併的內置函數,遞歸地發現嵌套對象中的屬性。 –

+0

您可以使用JSON,但對於大型數據集可能會很慢。儘管如此,它儘可能接近內置的克隆,實際上比大多數庫方法更快。 – dandavis

+0

注意,從JSON解析到JSON並不適用於函數。 –

回答

0

首先我要告訴你,這不是防彈的解決方案(日期對象的情況下)。如果你想 「正確」 的答案,這裏是您的解決方案 `

var dst,src = { "edf" : {"zyx" : "right"}}; 
dst=JSON.parse(JSON.stringify(src)); 
dst["a"] = 1; 
src.edf.zyx = "wrong"; 
console.log(src,dst); 

` 所以,請閱讀以下鏈接瞭解深拷貝更好

Most elegant way to clone a JavaScript object

Copy JavaScript object to new variable NOT by reference?

+0

嘗試在我上面的示例obj上運行以查看它失敗的位置(具體來說,日期和函數) 。 –

+0

它肯定會失敗,這就是爲什麼我給出了鏈接,並且還提到了「如果你想要」正確的「作爲答案」。 –

+0

請注意,這不會複製不可枚舉的屬性或符號,因此這不是防彈的。 – Sheepy