2016-11-05 145 views
6

這可能是一個老問題,但我真的很好奇通過引用複製對象的本質作爲JavaScript中的任務。硬拷貝vs淺拷貝javascript

這意味着,如果

var a = {}; 
var b = a; 
a.name = "Renato"; 
console.log(b); 
Object {name: "renato"} 

我有點新的JavaScript,這確實引起了我的注意有一個淺拷貝爲對象分配的默認值。我搜索了一下,爲了創建一個硬拷貝,你必須創建一個mixin。我想知道爲什麼這個選擇作爲默認,因爲它的轉變似乎是非常隱含的。謝謝!

+0

'想知道爲什麼選擇這個作爲默認'因爲在大多數情況下,這將是最好的選擇,.. Javascript是一個垃圾收集環境,它的優點之一是能夠傳遞對象而不必擔心內存泄漏。而另一個優點是速度.. – Keith

+0

此外,深度複製成本更高。默認做淺拷貝讓程序員可以自由地明確地選擇他們想要執行哪一個 – Alex

回答

11

對象和數組被視爲對同一對象的引用。如果你想克隆這個對象,有幾種方法可以做到這一點。

在以後的瀏覽器,你可以這樣做:

var b = Object.assign({}, a); 

如果你想要去圖書館,lodash提供_.clone(和_.cloneDeep):

var b = _.clone(a); 

如果你不想做任何一種方法,你可以通過每個鍵和值枚舉並將它們分配給一個新的對象。

通常情況下,它們在通過多個函數等時被視爲引用是很有價值的。對於像數字和字符串這樣的基本類型而言,情況並非如此,因爲在大多數情況下,這會非常違反直覺。

+0

你也可以添加好舊的JSON.parse/stringify ..'var b = JSON.parse(JSON.stringify(a))' – Keith

+0

@Keith也是另一種想法,但這對於具有函數值的對象不起作用。 –

+0

如果我們有'{a:'b',c:function(){}}',將它串化將會導致'「''''''' –