Почему индекс строки в массиве 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 = "";
Ответы
Ответ 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, что является недопустимым.