Ответ 1
Следует отметить, что существует разница между регулярными массивами и ассоциативными массивами. В регулярных массивах (реальных массивах) индекс должен быть целым числом. С другой стороны, ассоциативные массивы могут использовать строки как индекс. Вы можете придумать ассоциативные массивы как карту, если хотите. Теперь также обратите внимание, что истинные массивы всегда начинаются с нуля. Таким образом, в вашем примере вы создали массив следующим образом:
a = [];
a["1"] = {"string1":"string","string2":"string"};
a["2"] = {"string1":"string","string2":"string"}
Javascript смог преобразовать индексы строк в числа, поэтому ваш код выше:
a = [];
a[1] = {"blah"};
a[2] = {"blah"};
Но помните, что я сказал ранее: True массивы начинаются с нуля. Поэтому интерпретатор javascript автоматически назначил [0] на undefined. Попробуйте либо в firebug, либо в консоли Chrome/Safari, и вы увидите что-то подобное, когда вы попытаетесь напечатать "a". Вы должны получить что-то вроде "[undefined, Object, Object]. Следовательно, размер 3 не 2, как вы ожидали.
В вашем втором примере я уверен, что вы пытаетесь имитировать использование связанного массива, который по существу добавляет свойства к объекту. Помните, что связанные массивы позволяют вам использовать строки в качестве ключа. Таким образом, в других терминах вы добавляете свойство к объекту. Итак, в вашем примере:
b["key1"] = {"string1":"string","string2":"string"};
это действительно означает:
b.key1 = {"string1":"string","string2":"string"};
Инициализация b = [] просто создает массив, но ваше назначение не заполняет массив. Он просто дает дополнительные свойства "b". Надеюсь, это поможет..: -)