Подтвердить что ты не робот

Объявление массива 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, не выдает предупреждений.

4b9b3361

Ответ 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) вида синтаксиса