В javascript, когда использовать литерал объекта и когда использовать массив?
Вот пример. Моя забота заключается в том, чтобы оба, кажется, сделали свою работу. какой из них предпочесть?
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 ответов:
В этом примере на самом деле не сравниваются объекты и массивы. Вы просто добавляете ненужный слой, помещая объект в первый элемент массива.
Используйте объект, когда вам нужно обратиться к чему-то по имени.
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'
Объекты, как правило, больше о сохранении групп связанных значений и методов вместе для удобства ссылки. Массивы - это просто список вещей, которые все могут, как правило, предполагается, что они применимы к одной и той же вещи или вытекают из нее.
Цикл
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]); } }
Используйте массив, когда вы знаете, что у вас будет более одного объекта. Массив одного элемента не нужен, если используется только один объект.
Как вы можете видеть, синтаксис также немного сложнее (у вас есть
[...]
иbar
при использовании массивов -> используется больше символов), поэтому не используйте его, если вам это не нужно.
Используйте массив, если вам нужны списки, и используйте объекты, если вам нужны свойства.
В приведенном выше случае я предпочел бы последнее.
Кроме того, никогда не используйте
for in
на массиве (это чрезвычайно медленно и нарушает цель) и всегда используйтеhasOwnProperty
при переборе свойств объекта.
Массив используется, когда требуется использовать более одного элемента. Пример:
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);