2013-04-01 48 views
4

提供數組(列表,向量,元組等)的任何編程語言都必須決定它們是否具有引用或值語義,其中通常/明顯的選擇是可變數組的引用語義和不可變的值語義那些。數組引用與值語義

提供可變數組的JavaScript似乎選擇了引用語義,例如鑑於

var a = [1, 2, 3] 
var b = [1, 2, 3] 

然後a != b,符合市場預期,因爲儘管它們具有相同的內容,它們是不同的陣列。

但是,當您將它們用作對象中的鍵時,圖片會發生變化;如果您將obj[a]設置爲某個值,則obj[b]的值會相同。此外,如果更改數組的內容,這仍然是真實的;至少當我在Rhino中進行測試時,它的行爲就好像解釋器在每次查找時遞歸地比較提供和存儲的關鍵數組的全部內容,並檢查如果其中一個數組產生時發生的無限循環指向自己。

這是所有實現中的預期/指定行爲嗎?

它也適用於用作鍵的對象嗎?

有沒有什麼辦法可以獲得其他行爲,即查找使用數組作爲參考語義鍵的值?

回答

8

當陣列用作屬性名稱它們轉換爲字符串:

[1,2,3].toString() == '1,2,3' 

一旦變成一個字符串值,具有相同內容的陣列將映射到相同的屬性。

要回答最後一個問題,您不能使用對象來引用屬性名稱(鍵),從而只有同一個對象映射到相同的屬性(1:1映射)。

4

obj[a]obj[b]將在陣列上運行toString函數,併爲兩者生成相同的結果。它不嘗試使用數組作爲鍵。

var a = [1,2,3]; 


var x = {}; 

x[a] = "test"; 

var i; 
for(i in x) 
{ 
    alert(i); //"1,2,3" 
} 

jsFiddle example

+0

傑克通過30秒:)離開我的答案彌補了小提琴例如打我。 –