Неверная длина массива 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
443   3  

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

    Ничего не найдено.