2016-06-14 185 views
1

1)我想將一個鍵值對序列添加到JS普通對象中,其中鍵本身就是一個對象。每次添加鍵值對時,對象都會被覆蓋(請參閱實況here)。將鍵值對添加到JavaScript對象,其中鍵是一個對象

var x = {}; 

var y = { 
    'name': 'cat', 
    'note': 'lazy animal' 
} 
var yy = 'meow' 

x[{ 
    'name': 'dog', 
    'note': 'loyal animal' 
}] = 'bhow' 
x[y] = yy 

for(var k in x) { 
    console.log(k); 
    console.log(x[k]); 
} 

控制檯輸出:

"[object Object]" 
"meow" 

2)本(覆蓋的行爲)時,關鍵是一個字符串不會發生(見現場here)。

var x = {}; 

var y = 'cat' 
var yy = 'meow' 

x['dog'] = 'bhow' 
x[y] = yy 

for(var k in x) { 
    console.log(k); 
    console.log(x[k]); 
} 

控制檯輸出:

"dog" 
"bhow" 
"cat" 
"meow" 

想明白爲什麼會這樣?

我想通過其他問題(here)解決我們的一些解決方案。但我無法理解這裏的概念。任何指導將不勝感激。

+3

你不能。對象鍵只能是字符串或符號。你想要一張地圖。 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map –

+0

對象鍵應該是字符串。而且,你沒有在第二個例子中指定相同的密鑰,所以顯然不會有覆蓋? –

回答

0

對象鍵必須是字符串(或符號),因此當您嘗試將對象用作鍵時,它首先會將其轉換爲字符串表示形式,您已經看到它是"[object Object]"

可以但是你希望通過覆蓋在你的對象toString函數做什麼,只要你返回一個唯一的字符串爲每個對象(或許爲對象的內容哈希),您的代碼將按預期方式工作,因爲它將使用toString函數來獲得你的對象的字符串表示,並用其作爲重點:

var x = {}; 
 

 
var y = { 
 
    'name': 'cat', 
 
    'note': 'lazy animal', 
 
    toString: function() { 
 
    return 'yobj'; 
 
    } 
 
}; 
 
var yy = 'meow'; 
 

 
x[{ 
 
    'name': 'dog', 
 
    'note': 'loyal animal', 
 
    toString: function() { 
 
    return 'xobj'; 
 
    } 
 
}] = 'bhow'; 
 
x[y] = yy; 
 

 
for (var k in x) { 
 
    console.log(k); 
 
    console.log(x[k]); 
 
}


正如Jared在his comment中提到的,Map對象(在去年推出的ES6中)部分旨在解決此問題,並允許您直接使用對象作爲您的密鑰(如果您在environment that supports its use中運行)。

0

無論何時您將某物傳遞給對象的屬性存取器(object[...]語法),它都會轉換爲一個字符串(請參閱here「屬性名稱」下的)。

像你正在使用的簡單的Javascript對象,使用the default toString()方法將其轉換爲字符串,該方法僅返回"[object Object]"。這就是爲什麼他們最終都指向相同的價值。

相關問題