В javascript, когда использовать объектный литерал, а когда использовать массив? - PullRequest
2 голосов
/ 19 января 2011

Вот пример.Мое беспокойство - оба, кажется, делают работу.какой из них предпочтительнее?

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

Еще раз и заранее спасибо тем, кто помогает мне с вопросом.

Ответы [ 5 ]

9 голосов
/ 19 января 2011

В примере не сравниваются объекты и массивы. Вы просто добавляете ненужный слой, помещая объект в первый элемент массива.

Используйте объект, когда вам нужно обратиться к чему-то по имени.

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 голосов
/ 19 января 2011

A 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 голос
/ 19 января 2011

Используйте массив, если вам нужны списки, и используйте объекты, если вам нужны свойства.

В приведенном выше случае я бы предпочел последний.

Кроме того, никогда не используйте for in для массива (это чрезвычайно медленно и не соответствует цели) и всегда используйте hasOwnProperty при переборе свойств объекта.

1 голос
/ 19 января 2011

Вы используете массив, когда вам нужно использовать более одного элемента.Пример:

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 голос
/ 19 января 2011

Используйте массив, если вы знаете, что у вас будет более одного объекта.Массив из одного элемента не требуется, когда будет использоваться только один объект.

Как видите, синтаксис также немного сложнее (у вас есть [...] и bar при использовании массивов -> используется больше символов), поэтому не используйте его, если вы неТ надо.

...