Особенности свойства length массивов

В JavaScript свойство length возвращает длину или количество элементов некоторой сущности (объекта). Например, для строки свойство length вернет количество символов в строке, а для плотного массива - число элементов.

Следует избегать именования переменных словом length, т.к. в JavaScript оно является зарезервированным и относится к глобальному объекту window:

Массивы в JavaScript индексируются с нуля:

  • первый элемент массива имеет индекс, равный 0;
  • индекс последнего элемента равен значению свойства массива (length – 1).

Cвойство length массива (который является экземпляром объекта типа Array) устанавливает или возвращает число элементов этого массива, включая пустые (т.е. не имеющие значений) элементы.

Свойство length массива:

  1. является целым числом с положительным знаком и значением, меньшим чем 232;
  2. всегда численно больше чем самый наибольший индекс элемента в массиве.

Например:

Плотный массив хранит набор значений (элементов массива), идентифицируемых по индексу или набору индексов, принимающих целые (или приводимые к целым) значения из некоторого заданного непрерывного диапазона.

Разрежённый массив — абстрактное представление обычного массива, в котором данные представлены не непрерывно, а фрагментарно, при этом пропущенные элементы индексов не имеют:

Особенности свойства length массива:

  1.  Замечание 1: Cвойство length не указывает количество элементов массива с определёнными значениями:
    • в плотном массиве количество элементов соответствует значению свойства length массива без единицы (т.е. length-1);
    • в разреженном массиве length не указывает на реальное количество элементов: значение length будет больше, чем количество элементов массива, имеющих значение.
  2. Замечание 2: При добавлении или удалении элементов значение length изменяют только операции, изменяющие максимальный индекс элементов (т.е. размер массива). Любые изменения массива, которые не влияют на индекс с максимальным значением, не изменяют значение length, например, при использовании delete:
  3. Замечание 3: Когда при изменении новое значение length меньше или равно максимальному индексу, любые элементы, индекс которых больше или равен новому значению length (т.е. новому размеру массива), удаляются:
    • При использовании значения length большего, чем максимальный индекс, массив станет разреженным.

  4. Замечание 4: Свойству length можно присвоить нечисловой тип данных, при этом JavaScript преобразует примитив в число. Если результат преобразования равен NaN или отрицательному числу, то выдается ошибка Uncaught RangeError: Invalid array length («недопустимая длина массива»):

Изменение свойства массива length, удаление элементов с помощью delete, добавление элементов с новым индексом может является причиной возникновения создаются разрежённых массивов. 

Взаимосвязь свойства length с числовыми свойствами массивов

Некоторые встроенные методы массива (например, join, slice, indexOf и т.д.) учитывают значение свойства length при своём вызове. Другие методы (например, push, splice и т.д.) в результате своей работы обновляют свойство length массива.

При установке свойства в массиве, если свойство имеет действительный индекс и этот индекс выходит за пределы текущих границ массива, движок соответствующим образом обновит свойство length:

Уменьшение свойства length приводит к удалению элементов массива:

Для исключения появления разреженных массивов при удалении или добавлении элементов следует использовать специальные методы push(), unshift(), pop(), shift()

Добавление элемента в конец массива (метод push() )

Метод push():

  • присоединяет элементы к концу массива, используя для определения места вставки свойство length;
  • возвращает новое значение свойства length объекта, для которого был вызван данный метод. 

Метод push не является привязанным к типу Array: этот метод может быть вызван или применён и к массивоподобным объектам. 

Особенности метода push():

  1. Если свойство length не может быть преобразовано в число, будет использован индекс 0. Если свойство length не существует, то в этом случае оно будет создано.
  2. К строкам (как массивоподобным объектам) метод push() применён быть не может, так как строки являются неизменяемыми.

Примеры

Функция, которая принимает значение переменной n и возвращает массив, заполненный числами от 1 до n

[свернуть]

Добавление элемента в начало массива (метод unshift() )

Метод unshift():

  • добавляет элементы в начало массива;
  • возвращает новое значение свойства length объекта, для которого был вызван данный метод. 

Метод unshift() не является привязанным к типу Array: этот метод может быть вызван или применён и к массивоподобным объектам. 

Удаление элемента с конца массива (метод pop() )

Метод pop():

  • удаляет последний элемент из массива (изменяет длину массива);
  • возвращает значение удаленного из массива элемента (или undefined, если массив пуст).

Метод pop() не является привязанным к типу Array: этот метод может быть вызван или применён и к массивоподобным объектам. 

Удаление элемента из начала массива (метод shift() )

Метод shift():

  •  удаляет первый элемент из массива (изменяет длину массива, последовательно сдвигая значения индексов по направлению к нулю);
  • возвращает значение удаленного из массива элемента (или undefined, если массив пуст).

Обрезка массива ( метод slice() )

Метод slice() возвращает новый массив, содержащий копию части исходного массива.

Синтаксис метода slice():

Параметры метода slice ():

  • begin (необязательный) - индекс, с которого начинается извлечение (отсчёт начинается с 0):
    1. если индекс отрицательный, begin указывает смещение от конца последовательности (т.е. вызов slice(-2) извлечёт два последних элемента последовательности);
    2. если begin не определен, slice() начинает работать с индекса 0;
    3. если begin больше длины последовательности - вернется пустой массив.
  • end (необязательный) - индекс (счёт начинается с нуля), по которому заканчивать извлечение. Метод slice() извлекает элементы с индексом меньше end (т.е. вызов slice(1, 4) извлечёт элементы со второго по четвёртый (элементы по индексам 1, 2 и 3):
    1. если индекс отрицательный, end указывает смещение от конца последовательности (т.е. вызов slice(2, -1) извлечёт из последовательности элементы начиная с третьего элемента с начала и заканчивая вторым с конца);
    2. если end опущен, slice() извлекает все элементы до конца последовательности (т.е. до arr.length).

Возвращаемое значение:

  • новый массив, содержащий извлеченные элементы.

Метод slice() не изменяет исходный массив, а возвращает новую «одноуровневую» копию, содержащую копии элементов, вырезанных из исходного массива.

Элементы исходного массива копируются в новый массив по следующим правилам:

  • метод slice() копирует ссылки на объекты в новый массив. И оригинал, и новый массив ссылаются на один и тот же объект. То есть, если объект по ссылке будет изменён, изменения будут видны и в новом, и в исходном массивах.
  • метод slice() копирует значения строк и чисел (но не объекты String и Number) в новый массив. Изменения строки или числа в одном массиве никак не затрагивает другой. Если к любому массиву будет добавлен новый элемент, это никак не повлияет на другой массив.

 

Добавление и удаление элементов массива с определённым индексом ( Array.splice() )

[свернуть]

Добавить комментарий

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.