56. Доступ к элементам и индексы.
Любой массив – это объект.
Любой объект – это коллекция свойств и значений.
Любое свойство имеет имя.
Универсальное обращение к свойству: obj[name], где name автоматически приводится к string (а если имя свойства – это правильный идентификатор, то можно так: obj.name).
Примеры показывают состав индексов массива:
var a = [];
// индексов нет
a[0] = 10;
// один индекс: 0
var x = a[1];
// один индекс: 0
var b = [1, ,3];
// два индекса: 0 и 2
delete b[0];
// один индекс: 2
b[2] = undefined;
// один индекс: 2
var c = new Array();
// индексов нет
var d = new Array(2);
// индексов нет!
var e = new Array(1, "Alex");
// два индекса: 0 и 1
length
Любой массив имеет свойство length
.
Интуитивно: это «длина» массива, т.е. количество элементов в нём. Но это справедливо только для плотных массивов – у разреженных свои нюансы!
Всегда верно: length будет больше максимального индекса массива (и почти всегда – ровно на 1).
var a = [];
// length = 0
a[0] = 10;
// length = 1
a[10] = 100;
// length = 11
delete a[10];
// length = 11
var b = [1, ,3];
// length = 3
b[2] = undefined;
// length = 3
var c = new Array(2);
// length = 2
c[0] = 10;
// length = 2
Свойство length можно записывать. Уменьшение length приводит к «усечению» массива – исчезают элементы и индексы:
var a = [1, 2, 3];
a.length = 2;
// у массива a индексы 0 и 1
При увеличении length не появляется ни новых элементов, ни новых индексов:
var b = [1, 2];
b.length = 3;
// у массива b индексы 0 и 1
Обычно обход выполняется при помощи for:
for(var i = 0; i < a.length; i++)
alert(a[i]);
//(Микро)оптимизация:
for(var i = 0, len = a.length; i < len; i++)
alert(a[i]);
//Пропускаем несуществующие и undefined-элементы:
for(var i = 0; i < a.length; i++) {
if (a[i] === undefined) continue;
// тело цикла
}
//Пропускаем только несуществующие элементы:
for(var i = 0; i < a.length; i++) {
if (!(i in a)) continue;
// тело цикла
}
Для обхода «сильно» разреженного массива можно применить цикл for/in:
for(var index in sparseArray) {
var value = sparseArray[index];
// далее операции с индексами и значениями
}
Желательно задуматься о проверках, чтобы делать перебор только собственных свойств, которые одновременно являются индексами.