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

Почему индекс строки в массиве javascript не увеличивает размер длины?

В приведенном ниже примере массив2.length составляет всего десять, когда, на мой взгляд, это должно быть 13. Почему индексы с "строковыми ключами" не увеличивают длину массива? Я могу хранить вещи и получать к ней доступ, а отладчик VS показывает, что эти массивы хранятся правильно. Итак, почему длина не увеличивается?

var array2 = new Array();
array2["a"] = new Array();
array2["b"] = new Array();
array2["c"] = new Array();
for (var i = 0; i < 10; ++i)
    array2[i] = new Array();

var nothing = "";
for (var i = 0; i < array2.length; ++i)
    nothing = "";
4b9b3361

Ответ 1

Javascript-массивы не могут иметь "строковые индексы". Javascript Array индексируется исключительно численно. Когда вы устанавливаете "индекс строки", вы устанавливаете свойство объекта. Они эквивалентны:

array.a = 'foo';
array['a'] = 'foo';

Эти свойства не являются частью хранилища данных массива.

Если вам нужны "ассоциативные массивы", вам нужно использовать объект:

var obj = {};
obj['a'] = 'foo';

Возможно, простейшая визуализация использует буквенную нотацию вместо new Array:

// numerically indexed Array
var array = ['foo', 'bar', 'baz'];

// associative Object
var dict = { foo : 42, bar : 'baz' };

Ответ 2

Поскольку длина определена как, плюс наибольший числовой индекс в массиве.

var xs = [];
xs[10] = 17;
console.log( xs.length ); //11

По этой причине вам нужно использовать только массивы для хранения индексированных по номерам чисел, вместо этого использовать простые объекты, если вы хотите использовать строки как ключи. Кроме того, в качестве побочного эффекта лучше использовать литералы типа [] или {} вместо new Array и new Object.

Ответ 3

Вы не добавляете элементы в массив; вы добавляете свойства к объекту Array.

Ответ 4

"строковые ключи" индексы не являются индексами вообще, а свойствами. array2["a"] - это то же самое, что сказать array2.a. Помните, что вы можете устанавливать свойства для любой переменной в javascript, что именно то, что вы здесь делаете.

Ответ 5

Как сказано выше, используйте объект для ассоциативных массивов.

Если вы этого не сделаете, вы не обязательно заметите, что делаете это неправильно, пока вы невинно используете "длину" в качестве индекса массива:

var myArray = [];
myArray["foo"] = "bar"; //works
console.log(myArray["foo"]) //print "bar"
myArray["length"] = "baz" //crash with a "RangeError: Invalid array length"

Это потому, что вы заменяете атрибут length массива на String, что является недопустимым.