javascript - 无法使用空格访问 javascript 对象的属性

标签 javascript javascript-objects

我正在创建一个 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']< 那样访问它) ?

最佳答案

这里有三种可能性:

  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.getOwnPropertyNamesObject.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/

相关文章:

javascript - 在效果之后运行 Click 函数

javascript - Node.js 进程什么时候会意外死亡?

javascript - 按对象属性值对数组进行数字排序

javascript - 如何在具有对象的 React 应用程序中循环遍历 javascript 数组并获取具有特定值的属性的计数

Mozilla Firefox 中的 JavaScript 排序函数输出与 Google Chrome 中不同

javascript - Facebook Canvas,无法在移动设备上从 Facebook 登录

javascript - 立即检测输入[type ="text"]的变化

json - 由于 SAPUI5 1.34 中的 JSONModel 已弃用 getData() 那么如何获取/更新模型?

javascript - 如何在不渲染的情况下清除堆叠图表

javascript - 在 Javascript 中, "this.something"是否查找 "something"的作用域链?