Длина массива 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
57
задан Serenti 27 March 2010 в 08:52
поделиться

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". Надеюсь, это поможет ..: -)

91
ответ дан 24 November 2019 в 19:30
поделиться

Из стандарта ECMAScript, ECMA-262, 5-е изд.

15.4.5.2 length

Свойство length этого объекта Array является свойством данных, значение которого всегда численно больше, чем имя каждого удаляемого свойства, имя которого является индексом массива.

Обратите внимание, что свойство length для массива учитывает только индексы массива, которые являются целыми числами; установка других свойств не влияет на длину.

Для массива a ["3"] эквивалентно a [3] (такое поведение указано в § 15.4.5.1); 3 - это индекс массива, а не свойство. Таким образом, установка a ["3"] влияет на длину массива. b ["key1"] эквивалентно b.key1 . Установка свойств не влияет на длину коллекции.

9
ответ дан 24 November 2019 в 19:30
поделиться

length возвращает 1 + наибольший целочисленный ключ в объекте.

В a наибольший ключ равен 2, поэтому 1 + 2 равно 3.

В b нет целочисленных ключей (есть ключи key1 ] и key2 , которые не могут быть преобразованы в целые числа), поэтому Javascript предполагает, что наибольший ключ равен -1 , а 1 + -1 дает 0 .

Эта программа поможет вам увидеть, что:

a = [];
a["1"] = {};
a["4"] = {};
alert(a.length); // Prints 5
18
ответ дан 24 November 2019 в 19:30
поделиться
Другие вопросы по тегам:

Похожие вопросы: