2017-08-07 54 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来访问它们。