Объявление массива Javascript: новый массив Array(), новый массив (3), ['a', 'b', 'c'] создают массивы, которые ведут себя по-другому
Рассмотрим этот пример кода Javascript:
a = new Array();
a['a1']='foo';
a['a2']='bar';
b = new Array(2);
b['b1']='foo';
b['b2']='bar';
c=['c1','c2','c3'];
console.log(a);
console.log(b);
console.log(c);
Результаты в консоли Firebug следующие:
Для a ('[]' нужно было развернуть, нажав кнопку "+" ):
[]
a1 "foo"
a2 "bar"
Для b:
[undefined, undefined]
Для c:
["c1", "c2", "c3"]
Мои вопросы:
- Я правильно использую синтаксис массива ['key'] = 'value'?
- Почему массив b работает как ожидалось?
- Почему массивы a и c отображаются по-разному в консоли? Также кажется, что jQuery не может выполнять итерацию через массив a с помощью метода .each().
- Не могли бы вы рекомендовать какие-либо хорошие руководства по работе с массивом Javascript?
ПРИМЕЧАНИЕ. Google Chrome Firebug отображает только [] для массива 'a', без возможности его расширения.
EDIT: Хорошо, кажется, что массивы в Javascript имеют только числовые ключи, поэтому добавление строки в качестве имени ключа делает объект из массива. Но почему не работает jQuery.each с ним?
$.each(a, function ()
{
alert ('derp');
})
Этот код, добавленный к script, не выдает предупреждений.
Ответы
Ответ 1
Массивы имеют числовые индексы. Таким образом,
a = new Array();
a['a1']='foo';
a['a2']='bar';
and
b = new Array(2);
b['b1']='foo';
b['b2']='bar';
не добавляют элементы в массив, а добавляют объекты .a1
и .a2
к объекту a
(массивы тоже являются объектами). В качестве дополнительного доказательства, если вы это сделали:
a = new Array();
a['a1']='foo';
a['a2']='bar';
console.log(a.length); // outputs zero because there are no items in the array
Ваш третий вариант:
c=['c1','c2','c3'];
присваивает переменной c
массив с тремя элементами. Доступ к этим трем элементам можно получить так: c[0]
, c[1]
и c[2]
. Другими словами, c[0] === 'c1'
и c.length === 3
.
Javascript не использует функциональность своего массива для других языков, вызывающих ассоциативные массивы, где вы можете использовать любой тип ключа в массиве. Вы можете реализовать большую часть функциональности ассоциативного массива, просто используя объект в javascript, где каждый элемент является только таким свойством.
a = {};
a['a1']='foo';
a['a2']='bar';
Обычно для использования этой цели используется ошибка, так как она просто путает людей, читающих ваш код, и приводит к ложным предположениям о том, как работает код.
Ответ 2
Массивы в JS имеют два типа свойств:
Регулярные элементы и ассоциативные свойства (не являющиеся объектами)
Когда вы определяете a = new Array()
, вы определяете пустой массив. Обратите внимание, что еще нет ассоциативных объектов
Когда вы определяете b = new Array(2)
, вы определяете массив с двумя местоположениями undefined.
В обоих примерах "a" и "b" вы добавляете ассоциативные свойства, то есть объекты к этим массивам.
console.log (a)
или console.log(b)
печатает элементы массива, т.е. []
и [undefined, undefined]
соответственно. Но поскольку a1/a2
и b1/b2
являются ассоциативными объектами внутри своих массивов, они могут регистрироваться только с помощью console.log(a.a1, a.a2)
вида синтаксиса