在JavaScript中,何时使用对象字面量,何时使用数组?

3

这是一个例子。我的担忧是它们两个都能完成工作,应该选择哪一个?

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

所以我不得不修改上面的代码,使其像下面这样工作。过于依赖对象字面量是否太糟糕了?
var fooObj1 = {
    1:{ "bar": { "blah": 9 } },
    2:{ "bar": { "blah": 4 } },
    3:{ "bar": { "blah":12} }
};

再次感谢并提前感谢那些帮助我解决问题的人。


我已经将这个问题链接到一个部分回答了我的查询的现有问题。 "...JavaScript对象根本没有长度属性,只有数组才有。如果你想知道在一个对象上定义了多少属性,你必须遍历它们并计数..." https://dev59.com/Wm445IYBdhLWcg3w0NSu#4690581 - Abhijit
1
你为什么避免使用数组符号?看起来你想要一个对象列表。一个对象只是一堆名称/值对。在第二个例子中,你有三组没有名称可以引用的对象。 - Erik Reppen
5个回答

10

这个示例并没有真正比较对象和数组。您只是通过在数组的第一个元素中放置一个对象来增加了不必要的层级。

当您需要按名称引用某些内容时,请使用对象。

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'

通常来说,对象更多的是为了方便引用相关值和方法而将它们组合在一起。数组只是一系列可以被认为都适用于同一事物或派生自同一事物的东西的列表。


2

for .. in循环用于枚举。你可能想要了解一下它。

如果你有一个对象数组,我建议使用传统的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]);
  }
}

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

1

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

正如您所看到的,语法也稍微复杂一些(在使用数组时有[...]bar -> 使用了更多字符),因此如果不需要,请不要使用它。


1

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

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

除此之外,永远不要在数组上使用for in(它非常缓慢且没有意义),并且在迭代对象的属性时始终使用hasOwnProperty


啊哈,了解“for in”的性能方面真是太好了。谢谢。 - Abhijit

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接