Неверная длина массива Javascript для массива объектов
может кто-нибудь объяснить это (странное) поведение? Почему длина в первом примере 3, а не 2, и самое главное, почему длина во втором примере 0? Пока ключи числовые, длина работает. Когда их нет, длина 0. Как я могу получить правильную длину из второго примера? Спасибо.
a = [];
a["1"] = {"string1":"string","string2":"string"};
a["2"] = {"string1":"string","string2":"string"};
alert(a.length); // returns 3
b = [];
b["key1"] = {"string1":"string","string2":"string"};
b["key2"] = {"string1":"string","string2":"string"};
alert(b.length); // returns 0
3 ответов:
следует отметить, что существует разница между обычными массивами и ассоциативными массивами. В обычных массивах (реальных массивах) индекс должен быть целым числом. С другой стороны, ассоциативные массивы могут использовать строки в качестве индекса. Вы можете думать об ассоциативных массивах как о карте, если хотите. Теперь также обратите внимание, что истинные массивы всегда начинаются с нуля. Таким образом, в вашем примере вы создали массив следующим образом:
a = []; a["1"] = {"string1":"string","string2":"string"}; a["2"] = {"string1":"string","string2":"string"}Javascript смог преобразовать ваши строковые индексы в числа, следовательно, ваш код выше будет:
a = []; a[1] = {"blah"}; a[2] = {"blah"};но помните, что я сказал ранее: истинные массивы начинаются с нуля. Поэтому интерпретатор javascript автоматически назначает[0] неопределенному. Попробуйте это либо в firebug, либо в консоли chrome/safari, и вы увидите что-то вроде этого при попытке распечатать "a". Вы должны получить что-то вроде "[undefined, Object, Object]. Следовательно, размер 3 Не 2, как вы ожидали.
во втором примере я почти уверен вы пытаетесь имитировать использование связанного массива, который по существу добавляет свойства к объекту. Помните, связанные массивы позволяют использовать строки в качестве ключей. Таким образом, другими словами, вы добавляете свойство к объекту. Так что в вашем примере:
b["key1"] = {"string1":"string","string2":"string"};это на самом деле означает:
b.key1 = {"string1":"string","string2":"string"};инициализация b =[] просто создает массив, но ваше назначение не заполняет массив. Это просто дает" b " дополнительные свойства. Надеюсь, это поможет.. : -)
length возвращает 1 + самый большой целочисленный ключ в объекте.
на
aсамый большой ключ-2, поэтому 1+2 - 3.на
bнет целочисленных ключей (ключи естьkey1иkey2который не может быть преобразован в ints) поэтому Javascript предполагает, что самый большой ключ --1и1 + -1доходность0.эта программа поможет вам увидеть, что:
a = []; a["1"] = {}; a["4"] = {}; alert(a.length); // Prints 5
из стандарта ECMAScript, ECMA-262, 5-е изд.
длина 15.4.5.2
свойство length этого объекта массива является свойством данных, значение которого всегда численно больше, чем имя каждого удаляемого свойства, имя которого является индексом массива.
обратите внимание, что свойство length массива учитывает только индексы массива, которые являются целыми числами; установка других свойств не влияет на длину.
для массив,
a["3"]эквивалентноa[3](это поведение определяется § 15.4.5.1); 3 является индексом массива, а не свойством. Таким образом, установкаa["3"]влияет на длину массива.b["key1"]эквивалентноb.key1. Установка свойств не влияет на длину коллекции.
Comments