Вторая особенность в поведении, обеспечивающем работу свойства
length
, заключается в том, что при присваивании свойству
length
неотрицательного целого числа n, меньшего, чем его текущее значение, все элементы массива с индексами, большими или равными значению n, удаляются из массива:
а = [1,2,3,4,5]; // Создать массив с пятью элементами.
a.length =3; // теперь массив а содержит элементы [1,2,3].
a.length = 0; // Удалит все элементы,
а - пустой массив [].
a.length = 5; // Длина равна 5, но элементы отсутствуют, подобно Аггау(5)
В свойство
length
массива можно также записать значение больше, чем его текущее значение. В этом случае в массив не добавляются новые элементы, а просто создается разреженная область в конце массива.
В ECMAScript 5 свойство
length
массива можно сделать доступным только для чтения, с помощью
Object.defineProperty
(раздел 6.7):
а = [1,2,3]; // Создать массив а с тремя элементами.
Object.defineProperty(a, ‘length", // Сделать свойство length
{writable: false}); // доступным только для чтения,
a.length =0; //а не изменится.
Аналогично, если сделать элемент массива ненастраиваемым, его нельзя будет удалить. Если элемент нельзя будет удалить, то и свойство
length
не может быть установлено в значение, меньшее или равное индексу ненастраиваемого элемента. (Смотрите раздел 6.7, а также описание методов
Object.seal
и
Object.freeze
в разделе 6.8.3.)
7.5. Добавление и удаление элементов массива
Мы уже видели, что самый простой способ добавить элементы в массив заключается в том, чтобы присвоить значения новым индексам:
а = [] // Создать пустой массив.
а[0] = "zero"; // И добавить элементы.
а[1] = "one";
Для добавления одного или более элементов в конец массива можно также использовать метод
push:
а = []; // Создать пустой массив
a.push("zero") // Добавить значение в конец, а = ["zero"]
a.push("one", "two") // Добавить еще два значения,
а = ["zero", "one", "two"]
Добавить элемент в конец массива можно также, присвоив значение элементу
а[а.length]
. Для вставки элемента в начало массива можно использовать метод
unshift
(описывается в разделе 7.8), при этом существующие элементы в массиве смещаются в позиции с более высокими индексами.
Удалять элементы массива можно с помощью оператора
delete
, как обычные свойства объектов:
а = [1.2.3];
delete
а[1]; // теперь в массиве а отсутствует элемент с индексом 1
1 in а // => false: индекс 1 в массиве не определен
Удаление элемента напоминает (но несколько отличается) присваивание значения
undefined
этому элементу. Обратите внимание, что применение оператора
delete
к элементу массива не изменяет значение свойства
length
и не сдвигает вниз элементы с более высокими индексами, чтобы заполнить пустоту, оставшуюся после удаления элемента. После удаления элемента массив превращается в разреженный массив.
Кроме того, как уже было показано выше, имеется возможность удалять элементы в конце массива простым присваиванием нового значения свойству
length
. Массивы имеют метод
рор
(противоположный методу
push
), который уменьшает длину массива на 1 и возвращает значение удаленного элемента. Также имеется метод
shift
(противоположный методу
unshift
), который удаляет элемент в начале массива. В отличие от оператора
delete
, метод
shift
сдвигает все элементы вниз на позицию ниже их текущих индексов. Методы
рор
и
shift
описываются в разделе 7.8 и в справочном разделе.
Наконец существует многоцелевой метод
splice
, позволяющий вставлять, удалять и замещать элементы массивов. Он изменяет значение свойства
length
и сдвигает элементы массива с более низкими или высокими индексами по мере необходимости. Подробности приводятся в разделе 7.8.
7.6. Обход элементов массива
Наиболее часто для обхода элементов массива используется цикл
for
(раздел 5.5.3):
var keys = Object.keys(o); // Получить массив имен свойств объекта о
var values = [] // Массив для сохранения значений свойств
for(var і = 0; і < keys.length; i++) { // Для каждого элемента в массиве
var key = keys[і]; // Получить имя свойства по индексу
values[i] = о[key]; // Сохранить значение в массиве values
}
Во вложенных циклах и в других контекстах, когда скорость работы имеет критическое значение, иногда можно увидеть такой оптимизированный способ выполнения итераций по массиву, когда длина массива определяется только один раз, а не в каждой итерации: