【问题标题】:In javascript, when to use object literal and when to use array?在 javascript 中,何时使用对象字面量以及何时使用数组?
【发布时间】:2011-01-19 13:39:39
【问题描述】:

这是一个示例。我担心的是两者似乎都能胜任。他们更喜欢哪一个?

var fooArr = [{ "bar": {"blah": 9 } }];

for(var i in fooArr) {
    var value = fooArr[i].bar.blah;
console.log(value); //checking in firebug console
}

var fooObj = { "bar": {"blah": 9 } };
for(var i in fooObj) {
    var value = fooObj[i].blah;
console.log(value); //checking in firebug console
}

此外,以下似乎无效,任何避免数组表示法的方式。

var fooObj1 = {
    { "bar": { "blah": 9 } },
    { "bar": { "blah": 4 } },
    { "bar": { "blah":12} }
};

所以我不得不将上面的代码修改为下面的代码。对 Object 字面量过于执着是不是太糟糕了

var fooObj1 = {
    1:{ "bar": { "blah": 9 } },
    2:{ "bar": { "blah": 4 } },
    3:{ "bar": { "blah":12} }
};

再次感谢那些帮助我查询的人。

【问题讨论】:

  • 我已将此链接到一个现有问题,该问题部分回答了我的查询。 “...JavaScript 对象根本没有长度属性,只有数组有。如果您想知道在对象上定义的属性的数量,您必须遍历它们并计算它们...”stackoverflow.com/questions/4690520/…
  • 为什么要避免使用数组表示法?看起来你想要一个对象列表。一个对象只是一堆名称/值对。在第二个示例中,您有 3 组没有名称的对象来引用它们。

标签: javascript object-literal javascript-objects


【解决方案1】:

该示例并没有真正比较对象和数组。通过将对象放在数组的第一个元素中,您只是添加了一个不必要的层。

当您必须通过名称引用某物时使用对象。

var obj = {}

//3种做同样事情的方法:

var obj.newName = 'bob';

var obj['newName'] = 'bob';

var name = 'newName';
var obj[name] = 'bob';

第 2 种样式并不是真正需要的,实际上可能比第 1 种访问起来要慢一些,但它可以帮助您了解第 3 种如何有用。或者您可以直接执行以下操作:

var obj = { newName:'bob' }

如果你想在一个对象中有一堆名字,那就有点傻了:

var obj = { newName:'bob', anotherNewName:'sue', yetAnotherNewName:'billy' }

obj.newName === 'bob'
obj.anotherNewName === 'sue'
//etc...

这就是数组的用途。

var listOfNewNames = ['bob','sue','billy']
listOfNewNames[0] === 'bob'
listOfNewNames[1] === 'sue'
//etc...

当然,没有什么能阻止您将数组分配给对象属性:

obj { listOfNewNames:['bob','sue','billy'] }

obj.listOfNewNames[0] === 'bob'

或者,如上所示,一个数组中的多个对象:

var listOfMonsters = [
    { monsterName:'Grarrr',eats:'people' },
    { monsterName:'Wadsworth',eats:'other monsters'}
];

listOfMonsters[1].monsterName === 'Wadsworth'

对象通常更多地是将相关值和方法组保持在一起以便于参考。数组只是一个东西列表,通常可以假定所有东西都适用于或派生于同一事物。

【讨论】:

    【解决方案2】:

    for .. in 循环遍历枚举。你可能想read up就可以了。

    如果您有一组对象,我建议您使用传统的 for 循环:

    var fooObjs = [ {bar: "blah"}, {bar: "blah2"} ];
    for (var i = 0, j = fooObj.length; i < j; i++) {
      console.log(fooObjs[i].bar);
    }
    

    如果您有一个具有多个属性的对象,那么您可以使用for .. in 循环:

    var fooObj = { bar: "blah", baz: "blah2" };
    for (var i in fooObj) {
      if (fooObj.hasOwnProperty(i)) { // So you don't log prototype properties
        console.log(fooObj[i]);
      }
    }
    

    【讨论】:

      【解决方案3】:

      当您知道您将拥有多个对象时,请使用数组。当只使用一个对象时,不需要单项数组。

      如您所见,语法也有点复杂(使用数组时有[...]bar -> 使用了更多字符),所以如果不需要就不要使用它.

      【讨论】:

        【解决方案4】:

        如果需要列表,请使用数组,如果需要属性,请使用对象。

        在上述情况下,我更喜欢后一种。

        除此之外,永远不要在数组上使用for in(它是extremely slow 并且违背了目的)并且在迭代对象的属性时始终使用hasOwnProperty

        【讨论】:

        • 啊哈,很高兴知道“for in”的性能方面。谢谢。
        【解决方案5】:

        当您需要使用多个项目时,您可以使用数组。示例:

        var fooArr = [{ bar: { blah: 9 } },{ bar: { blah: 4 } },{ bar: { blah: 12 } }];
        for(var i in fooArr) {
          var value = fooArr[i].bar.blah;
          console.log(value); // will log "9", "4" and "12"
        }
        

        在第二个示例中,您只有一个对象,因此您根本不需要循环来访问该属性:

        var fooObj = { bar: { blah: 9 } };
        var value = fooObj.bar.blah;
        console.log(value);
        

        【讨论】:

          猜你喜欢
          • 2012-06-07
          • 2014-08-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-11-22
          • 1970-01-01
          相关资源
          最近更新 更多