我正在创建一个 JavaScript 对象并分配一个动态的键。所以key中可能有空格。我可以在浏览器控制台中看到该对象,如下所示,
{barTitle: 'Cash Flow', Cash Flow: 90254}
当我按如下方式循环访问对象时,
Object.keys(obj).forEach(function(key) {
console.log(key, obj[key]);
});
我得到以下结果,
barTitle Alrais
undefined
在浏览器控制台中。在上述情况下如何访问 key (请注意,该对象是动态的,我不知道 key 。如果知道 key ,那么我可以像 obj['Cash Flow']< 那样访问它
) ?
最佳答案
这里有三种可能性:
“现金流”属性是继承的,或者
“现金流”属性是不可枚举的,或者
两者都有。 :-)
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.getOwnPropertyNames
与 Object.getPrototypeOf
结合起来(ES2015 中的新增功能) ) 构建循环:
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
的属性,因此如果它位于对象的原型(prototype)链中,我们就提前停止。
另请注意,我假设您对以符号命名的属性不感兴趣。如果是,请使用 Object.getOwnPropertySymbols
来访问它们。
关于javascript - 无法使用空格访问 javascript 对象的属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45544229/