2015-12-23 65 views
3

我想知道當複製對象時,javascript是否進行淺度或深度複製。使用Javascript分配對象:淺層還是深層複製?

const a = ['value1', 'value2']; 
const b = ['value3', 'value4']; 
const new_ab = [a, b]; 

new_ab將會有新的分配值或參考?如果它是一個很深的複製品,我怎麼能讓它被吞下去?謝謝。

+1

'了'和'b'是對數組的引用,所以'new_ab'將是對包含這些引用的數組的引用。在您發佈的代碼中根本沒有任何對象被複制。 – Pointy

+1

你可以很容易地通過變異'new_ab [0]'來檢查這個,看看'a'發生了什麼。 – Blender

+0

因此,使用上面的代碼是完美的,因爲它們只是引用? –

回答

1

正如評論中暗示的那樣,JavaScript完全依賴於引用,唯一的例外是原始值保存在堆棧中,因此程序不需要引用來訪問它們。在你的例子中,所有的變量聲明都會創建新的值 - 每一個都是一個數組的實例 - 但是聲明一個數組返回的內容是一個引用,而不是數組本身。例如,[1, 2]是一個值(整數)數組,但[a, b]是一個引用數組。

因此... 沒有任何內容被複制。我們可以通過將對象放置爲數組的元素並檢查先前分配的屬性仍然可以通過新的「父」數組來訪問,從而證明這一點。

(並回答在評論你的問題,是的,你的例子是比如果你(或JavaScript)爲複製值更好的性能。)

'use strict'; 
 

 
const arrayOne = []; 
 

 
arrayOne.someProperty = "This string is a property of `arrayOne`, " + 
 
         "accessed via the reference to it in `arrayTwo`." 
 

 
const arrayTwo = [arrayOne]; 
 

 
span.innerHTML = arrayTwo[0].someProperty;
<span id="span"></span>

+1

*「唯一的例外是原始值保存在堆棧中,因此程序不需要引用」*您如何知道這一點?你能參考規格嗎?另外,這將如何與閉包工作呢? –

+0

@FelixKling並非所有的原始值都存儲在堆棧中。這些值被處理的方式是一個impl。詳細說明了規範的要求。當閉包需要原始值時,編譯器會將該值放在堆上。引用是[here](https://www.quora.com/JavaScript-programming-language/With-JavaScript-functions-always-acting-as-closures-at-what-point-do-any-variables-get-分配到堆棧而不是堆)和[這裏](http://duartes.org/gustavo/blog/post/closures-objects-heap/),儘管我有所有的傳聞沒有閱讀v8的源代碼。 :) – sdgluck

+0

不可否認,我對引用的語句表示自由,但是將原始值存儲在堆棧中的原則對於許多OOP語言來說是真實的。當強迫和其他類似的操作發生時,或者如你所說在封閉內引用一個值時,這個原則可能會被顛覆。 – sdgluck

相關問題