无法使用空格

时间:2017-08-07 09:59:52

标签: javascript javascript-objects

我正在创建一个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 个答案:

答案 0 :(得分:1)

这里有三种可能性:

  1. “现金流”属性是继承的,或

  2. “现金流量”属性不可枚举,或

  3. 两者。 : - )

  4. 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]中的新内容):< / p>

    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.getPrototypeOfES2015中的新内容)组合以构建循环:

    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访问它们。