2017-08-07 78 views
0

我正在創建一個JavaScript對象並分配一個動態的鍵。所以鑰匙可能會有空白。我能看到物體在瀏覽器控制檯如下,無法訪問javascript對象的空間屬性

{barTitle: 'Cash Flow', Cash Flow: 90254} 

當我通過對象循環如下,

Object.keys(obj).forEach(function(key) { 
    console.log(key, obj[key]); 
}); 

我得到以下結果,

barTitle Alrais 
undefined 

在瀏覽器控制檯中。如何在上述情況下訪問密鑰(請注意,對象是動態的,我不知道密鑰,如果知道密鑰,我可以像obj['Cash Flow']那樣訪問它)?

+1

裹在「你的對象的關鍵」,就像這樣:'「現金流」:90254' – Patrick2607

+0

你必須添加[MCVE]你的問題表明了問題,理想情況下** **可運行一個使用Stack Snippets('[<>]'工具欄按鈕)。假設對象實際上是正確創建的,沒有理由該屬性應該是未定義的:https://jsfiddle.net/txxj7fhx/ –

+0

@ Patrick2607:OP明確表示,這正是瀏覽器控制檯中顯示的內容(不是實際的對象初始值設定項) 。 –

回答

1

三種可能性在這裏:

  1. 「現金流」 屬性是繼承的,或者

  2. 「現金流」 屬性是不可枚舉,或

  3. 兩個。 :-)

Object.keys只給你一個對象的枚舉自己屬性的名稱。跳過了繼承的和不可枚舉的。

您可以使用for-in訪問所有枚舉的屬性,包括繼承的:

var proto = {"Cash Flow": 90254}; 
 
var obj = Object.create(proto); 
 
obj.barTitle = 'Cash Flow'; 
 

 
// Doesn't show 
 
Object.keys(obj).forEach(function(key) { 
 
    console.log(key, obj[key]); 
 
}); 
 
console.log("----"); 
 

 
// Shows: 
 
for (var key in obj) { 
 
    console.log(key, obj[key]); 
 
}

您可以使用Object.getOwnPropertyNames得到所有「自己」的一個對象的屬性,包括非(這在ES5 [2009]中是新的):

var obj = {barTitle: "Cash Flow"}; 
 
Object.defineProperty(obj, "Cash Flow", { 
 
    value: 90254 
 
}); 
 

 
// Doesn't show 
 
Object.keys(obj).forEach(function(key) { 
 
    console.log(key, obj[key]); 
 
}); 
 
console.log("----"); 
 

 
// Shows: 
 
Object.getOwnPropertyNames(obj).forEach(function(key) { 
 
    console.log(key, obj[key]); 
 
});

如果需要使用字符串名稱的所有屬性,包括繼承不可枚舉的,你可以很容易地Object.getPrototypeOf(新中ES2015)結合Object.getOwnPropertyNames建立一個循環:

var proto = {}; 
 
Object.defineProperty(proto, "Cash Flow", { 
 
    value: 90254 
 
}); 
 
var obj = Object.create(proto); 
 
obj.barTitle = "Cash Flow"; 
 

 
// Doesn't show 
 
Object.keys(obj).forEach(function(key) { 
 
    console.log(key, obj[key]); 
 
}); 
 
console.log("----"); 
 

 
// Shows: 
 
getAllPropertyNames(obj).forEach(function(key) { 
 
    console.log(key, obj[key]); 
 
}); 
 

 
function getAllPropertyNames(obj) { 
 
    var names = Object.create(null); 
 
    var p = obj; 
 
    while (p && p !== Object.prototype) { 
 
    Object.getOwnPropertyNames(p).forEach(function(name) { 
 
    names[name] = true; 
 
    }); 
 
    p = Object.getPrototypeOf(p); 
 
    } 
 
    return Object.keys(names); 
 
}

因此,我假設你不想看到Object.prototype的屬性,所以如果它在對象的原型鏈中。

另請注意,我假定您對符號名屬性不感興趣。如果是,請使用Object.getOwnPropertySymbols來訪問它們。