在javascript中,何时使用object literal以及何时使用数组?

时间:2011-01-19 13:39:39

标签: javascript object-literal javascript-objects

这是一个样本。我的担心似乎都在做。哪个更喜欢?

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 literals来粘贴太多太糟糕了

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

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

5 个答案:

答案 0 :(得分:9)

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

当您必须按名称引用某物时,请使用对象。

var obj = {}

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

var obj.newName = 'bob';

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

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

第二种风格并不是必需的,实际上可能比第一种更慢,但它可以帮助您理解第三种风格如何有用。或者你可以完全完成以下任务:

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'

对象通常更多地是将相关值和方法组保持在一起以便于参考。数组只是一个通常可以假设适用于或来自同一事物的东西的列表。

答案 1 :(得分: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]);
  }
}

答案 2 :(得分:1)

当您知道有多个对象时,请使用数组。当仅使用一个对象时,不需要一个项目数组。

正如您所看到的,语法也有点复杂(使用数组时有[...]bar - &gt;使用了更多字符),所以如果你不使用它不需要。

答案 3 :(得分:1)

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

在上述情况下,我更倾向于后者。

除此之外,永远不要在数组上使用for in(它是extremely slow并且无法实现目的)并且在迭代对象的属性时总是使用hasOwnProperty

答案 4 :(得分:1)

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

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);