Длина массива
Любой массив имеет свойство length
, и это свойство отличает массивы от обычных объектов JavaScript.
Для плотных (т. е. неразреженных) массивов свойство length
определяет количество элементов в массиве. Его значение на единицу больше самого большого индекса в массиве:
[].length // => 0: массив не имеет элементов
['a','b','c'].length // => 3: наибольший индекс равен 2, длина равна 3
Для разреженных массивов значение свойства length больше числа элементов, и все, что можно сказать в этом случае, – это то, что значение свойства length гарантированно будет превышать индекс любого элемента в массиве. Или, говоря иначе, массивы (разреженные или нет) никогда не будут содержать элемент, индекс которого будет больше или равен значению свойства length массива.
Для поддержки этого свойства массивы проявляют две особенности поведения.
Первая была описана выше: если присвоить значение элементу массива, индекс i которого больше или равен текущему значению свойства length, в свойство length записывается значение i+1.
Вторая особенность в поведении, обеспечивающем работу свойства length, заключается в том, что при присваивании свойству length
неотрицательного целого числа n, меньшего, чем его текущее значение, все элементы массива с индексами, большими или равными значению n, удаляются из массива:
a = [1,2,3,4,5]; // Создать массив с пятью элементами.
a.length = 3; // теперь массив a содержит элементы [1,2,3].
a.length = 0; // Удалит все элементы.
a - пустой массив [].
a.length = 5; // Длина равна 5, но элементы отсутствуют, подобно Array(5)
В свойство length
массива можно также записать значение больше, чем его текущее значение. В этом случае в массив не добавляются новые элементы, а просто создается разреженная область в конце массива.
В ECMAScript 5 свойство length
массива можно сделать доступным только для чтения, с помощью Object.defineProperty()
a = [1,2,3]; // Создать массив a с тремя элементами.
Object.defineProperty(a, "length", // Сделать свойство length
{writable: false}); // доступным только для чтения.
a.length = 0; // a не изменится.
Аналогично, если сделать элемент массива ненастраиваемым, его нельзя будет удалить. Если элемент нельзя будет удалить, то и свойство length не может быть установлено в значение, меньшее или равное индексу ненастраиваемого элемента.