[英]Adding key-value pair to javascript object where key is an object
1)我試圖將一系列鍵值對添加到JS普通對象,其中鍵本身是一個對象。 每次添加鍵值對時,對象都會被覆蓋(請參見此處 )。
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)當密鑰是字符串時,不會發生這種(覆蓋行為)(請參見此處 )。
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"
想了解為什么會發生這種情況?
我通過其他問題( 這里 )找出了一些解決方案。 但我無法理解這里的概念。 任何指導將不勝感激。
對象鍵必須是字符串(或符號),因此當您嘗試將對象用作鍵時,它首先將其轉換為字符串表示形式,您已經看到它是"[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在他的評論中提到的那樣, Map
對象(去年在ES6中引入)部分旨在解決這個問題,並允許您直接使用對象作為您的密鑰,如果您在支持其使用的環境中運行。
你傳遞的東西的對象(的屬性訪問任何時候object[...]
語法),它被轉換為字符串(見這里在“屬性名稱”)。
像您正在使用的那些簡單的Javascript對象使用默認的toString()
方法對字符串進行類型轉換, 該方法只返回"[object Object]"
。 這就是為什么他們最終都指向相同的價值。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.