JavaScript массивы

Array хранит упорядоченную коллекцию значений. Индексы начинаются с нуля; элементы могут иметь разные типы. Свойство length задаёт длину, но в массиве могут быть пустые позиции — индексы без элемента.

Массив обычно создают литералом [1, 2, 3]. Конструктор Array() с единственным числовым аргументом задаёт длину, а не значение элемента. Сравните способы создания в примере создания массива.

Методы массивов

Ниже перечислены собственные статические методы Array и методы его прототипа Array.prototype, доступные экземплярам. Унаследованные методы Object и Function в таблицы не включены. Конструктор и свойства не являются методами экземпляра.

Статические методы Array

Вызываются у конструктора, например Array.isArray(value), а не у отдельного массива. Получение массива из асинхронного источника показано в примере Array.fromAsync().

Статические методы Array
Метод Описание
Array.from() Преобразует и возвращает новый массив из массивоподобного или итерируемого объекта. Массивоподобный объект содержит length и элементы с числовыми индексами; итерируемый объект можно перебрать через for...of. Необязательная функция преобразует каждый элемент.
Array.fromAsync() Создаёт массив из асинхронного или обычного итерируемого объекта либо массивоподобного объекта. Возвращает Promise (объект будущего результата), который завершается новым массивом; значения обычного источника и результаты необязательной функции преобразования ожидаются последовательно, а не параллельно как в Promise.all().
Array.isArray() Метод определяет и возвращает логическое значение true в том случае, если переданное значение является массивом и false, если оно не является массивом.
Array.of() Метод создаёт новый массив из переданных аргументов: каждый аргумент становится элементом независимо от его типа. Например, Array.of(3) создаёт [3], а Array(3) — массив длины 3 без элементов.

Методы экземпляра массива

Вызываются у массива, например numbers.map(transform). Итератор выдаёт элементы по очереди; функция обратного вызова — функция, которую метод вызывает для обработки элемента.

Методы экземпляра массива
Метод Описание
at() Возвращает элемент по индексу; отрицательный индекс отсчитывается от конца: at(-1) — последний элемент. За границами массива возвращает undefined.
concat() Метод используется для объединения двух или более массивов в один, при этом он не изменяет существующие массивы, а возвращает новый массив. Также принимает отдельные значения; копирование поверхностное: вложенные объекты остаются общими.
copyWithin() Метод позволяет скопировать элементы массива (в зависимости от их индекса) и вставить их в тот же массив, заменяя определенные элементы массива (в зависимости от их индекса), длина массива при этом не изменяется. Изменяет исходный массив и возвращает его; конечный индекс не включается.
entries() Метод возвращает объект итератор, который содержит пары ключ/значение по каждому индексу в массиве.
every() Метод позволяет проверить (в порядке возрастания индекса), все ли элементы в массиве соответствуют условию, заданному в передаваемой функции. Возвращает логическое значение; для пустого массива — true. Пропускает отсутствующие элементы.
fill() Метод позволяет заполнить все элементы массива одним значением, при необходимости задавая значение начального индекса, с которого начинается заполнение и конечный индекс, который не включается в заполнение. Изменяет исходный массив и возвращает его. При заполнении объектом все позиции ссылаются на один объект.
filter() Метод позволяет создать новый массив, элементы которого соответствуют условию, заданному в переданной функции.
find() Метод возвращает значение первого элемента в массиве, который соответствует условию в переданной функции, или undefined, если ни один элемент не удовлетворяет условию в переданной функции.
findIndex() Метод возвращает индекс первого элемента в массиве, который соответствует условию в переданной функции, или -1, если ни один элемент не удовлетворяет условию в переданной функции.
findLast() Проверяет элементы справа налево и возвращает значение первого найденного в этом направлении элемента, удовлетворяющего условию функции. Если совпадения нет, возвращает undefined; отсутствующие элементы посещаются как undefined.
findLastIndex() Ищет по условию функции справа налево и возвращает индекс найденного элемента или -1. Как и findLast(), посещает отсутствующие элементы как undefined.
flat() Возвращает новый массив, раскрывая вложенные массивы до глубины depth (по умолчанию 1). Пропускает пустые позиции на раскрываемых уровнях; исходные массивы не изменяет, вложенные объекты не клонирует.
flatMap() Вызывает функцию для каждого существующего элемента и возвращает новый массив, раскрывая массивы результатов ровно на один уровень. Позволяет заменить элемент несколькими значениями или убрать его, вернув пустой массив; исходный массив не изменяет.
forEach() Позволяет выполнить переданную функцию один раз для каждого элемента в массиве. Возвращает undefined, пропускает отсутствующие элементы и не ожидает завершения асинхронных функций.
includes() Позволяет определить, содержит ли массив искомый элемент. В случае нахождения элемента метод возвращает логическое значение true, в обратном случае false. Находит также NaN, в отличие от indexOf().
indexOf() Метод возвращает индекс искомого элемента в массиве при первом совпадении, или -1 если элемент не найден.
join() Позволяет преобразовать и объединить все элементы массива в одно строковое значение.
keys() Возвращает новый итератор, который возвращает значения индексов массива.
lastIndexOf() Метод возвращает последний индекс искомого элемента в массиве при поиске справа налево, или -1 если элемент не найден.
map() Позволяет вызвать переданную функцию один раз для каждого элемента массива, формируя новый массив из результатов вызова этой функции.
pop() Позволяет удалить последний элемент из массива и возвратить его значение. Этот метод изменяет длину массива. Для пустого массива возвращает undefined.
push() Позволяет добавить один или более элементов в конец массива. После вызова (добавления элементов) возвращает значение, соответствующее длине массива.
reduce() Позволяет вызвать функцию обратного вызова один раз для каждого элемента массива в порядке возрастания индекса (слева-направо). Возвращаемое значение функции предоставляется как аргумент при следующем вызове функции, в результате чего возвращаемое значение последнего вызова становится возвращаемым значением метода (значение вычисляется из элементов массива). Если начальное значение аккумулятора не передано, им становится первый элемент в направлении обхода; функция вызывается со следующего. Пустой массив без начального значения вызывает TypeError. Отсутствующие элементы пропускаются.
reduceRight() Позволяет вызвать функцию обратного вызова один раз для каждого элемента массива в порядке убывания индекса (справа-налево). Возвращаемое значение функции предоставляется как аргумент при следующем вызове функции, в результате чего возвращаемое значение последнего вызова становится возвращаемым значением метода (значение вычисляется из элементов массива). Если начальное значение аккумулятора не передано, им становится первый элемент в направлении обхода; функция вызывается со следующего. Пустой массив без начального значения вызывает TypeError. Отсутствующие элементы пропускаются.
reverse() Позволяет обратить порядок следования элементов массива, таким образом, что первый элемент массива становится последним, а последний элемент первым (размещает элементы объекта Array в обратном порядке). Изменяет исходный массив и возвращает его. Для новой копии используйте toReversed().
shift() Позволяет удалить первый элемент из массива и возвратить его значение. Этот метод изменяет длину массива. Для пустого массива возвращает undefined.
slice() Позволяет возвратить новый массив с поверхностной копией выбранного диапазона элементов. Исходный массив не изменяется; конечный индекс не включается. Вложенные объекты не копируются и остаются общими.
some() Позволяет проверить, соответствует ли по крайней мере один элемент в массиве условию, заданному в передаваемой функции. Возвращает логическое значение; для пустого массива — false. Пропускает отсутствующие элементы.
sort() Сортирует исходный массив и возвращает его. По умолчанию сравнивает строковые представления элементов по кодовым единицам UTF-16, а не по правилам алфавита или величине чисел. Для чисел по возрастанию передайте функцию сравнения (a, b) => a - b. Для новой копии используйте toSorted().
splice() Позволяет изменить содержимое массива за счёт удаления существующих элементов, и/или добавления новых элементов в массив. Изменяет исходный массив и возвращает массив удалённых элементов. Для изменённой копии используйте toSpliced().
toLocaleString() Позволяет преобразовать и объединить все элементы массива в одно строковое значение, при этом элементы массива в зависимости от их типа преобразуются в строки с использованием своих собственных методов toLocaleString().
toReversed() Возвращает новую копию с обратным порядком элементов, сохраняя исходный массив. Пустые позиции превращаются в элементы со значением undefined.
toSorted() Возвращает новую отсортированную копию, сохраняя исходный массив. По умолчанию сравнивает строки по UTF-16; для чисел передайте функцию сравнения. Пустые позиции становятся undefined и идут в конец.
toSpliced() Возвращает новую копию после удаления, замены или вставки элементов с заданного индекса. Исходный массив не изменяет; возвращает именно изменённую копию, а не удалённые элементы. Пустые позиции в сохраняемой части становятся undefined.
toString() Позволяет преобразовать и объединить все элементы массива в одно строковое значение.
unshift() Позволяет добавить один или более элементов в начало массива. После вызова (добавления элементов) возвращает значение, соответствующее длине массива.
values() Возвращает итератор значений массива — объект для последовательного перебора элементов. Пустые позиции читаются как undefined; новый массив не создаётся.
with() Возвращает новую копию с заменой одного элемента по индексу, сохраняя исходный массив. Отрицательный индекс отсчитывается от конца; индекс за границами вызывает RangeError. Пустые позиции становятся undefined.
[Symbol.iterator]() Возвращает итератор значений; по умолчанию это та же функция, что values(). Используется при переборе for...of и разворачивании ...array; новый массив сам метод не создаёт.

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

Свойства читают без круглых скобок. В таблице указано, где находится каждое свойство: у экземпляра, в его прототипе или у конструктора. Унаследованные свойства Object и Function здесь не перечислены.

Свойства экземпляра, прототипа и конструктора Array
Свойство Описание
array.length Собственное свойство экземпляра. Длина — целое число от 0 до 2³² − 1; она больше любого существующего индекса, но не равна числу заполненных позиций. Уменьшение длины удаляет элементы за новой границей, увеличение добавляет пустые позиции. Недопустимое значение вызывает RangeError.
Array.prototype.constructor Свойство прототипа, доступное как array.constructor. По умолчанию ссылается на Array, но его можно переопределить. Для проверки массива используйте Array.isArray().
Array.prototype[Symbol.unscopables] Объект в прототипе, который исключает перечисленные в нём имена из поиска переменных внутри with. Нужен для совместимости старого кода; оператор with запрещён в строгом режиме.
Array.prototype Собственное свойство конструктора: общий прототип обычных массивов, содержащий их методы. Сам Array.prototype тоже является массивом; у отдельного массива свойства prototype по умолчанию нет.
Array[Symbol.species] Статическое свойство с геттером, по умолчанию возвращающим конструктор, у которого оно прочитано. Используется некоторыми методами, например map() и filter(), при создании результата у подклассов. Методы toReversed(), toSorted(), toSpliced() и with() его не учитывают и создают обычный Array.
Array.length Собственное свойство конструктора как функции: равно 1 и описывает число формальных параметров. Это не длина созданного массива и не ограничение числа передаваемых аргументов.
Array.name Собственное свойство конструктора как функции: имя "Array". Не является именем отдельного массива.

Сравните array.length и Array.length, затем уменьшите и увеличьте длину в примере создания массива. Новые пустые позиции не содержат элементов со значением undefined: проверка оператором in вернёт false.

Изменение массива и копирование

copyWithin(), fill(), pop(), push(), reverse(), shift(), sort(), splice() и unshift() изменяют исходный массив. Методы toReversed(), toSorted(), toSpliced() и with() возвращают новую копию. Сравните результаты в примере сортировки и копирования.

Копирование поверхностное: вложенные объекты остаются общими. Функция, переданная в map() или filter(), сама может изменить объект, хотя метод не изменяет структуру исходного массива. Поиск с конца и преобразование вложенных массивов показаны в примере поиска и преобразования.

Спецификация и поддержка

Состав методов и свойств соответствует ECMAScript: Array Objects. Поддержку конкретного метода или свойства проверяйте в его статье или в таблице совместимости Array: наличие самого Array не гарантирует наличие всех методов и свойств в старых браузерах.

Примеры, попробуйте сами

Чем Array(3) отличается от Array.of(3)

Измените число 3 и запустите код. Сравните длину, наличие элемента с индексом 0 и результат Array.from(). Измените присваивания length и проверьте, какие индексы остались.

index.html
HTML
<!doctype html>
<html lang="ru">
  <head>
    <meta charset="utf-8" />
    <title>Чем Array(3) отличается от Array.of(3)</title>
  </head>
  <body></body>
</html>
main.js
JavaScript
// Один числовой аргумент конструктора задаёт длину, но не создаёт элементы.
const emptySlots = Array(3)
const oneValue = Array.of(3)
console.log('Длина:', emptySlots.length, oneValue.length)
console.log('Есть индекс 0:', 0 in emptySlots, 0 in oneValue)
console.log('Значения:', oneValue)
console.log(
    'Последовательность:',
    Array.from({ length: 3 }, (_, index) => index + 1)
)

// Длина массива и число параметров конструктора — разные свойства.
const numbers = [10, 20, 30]
console.log('Массив и конструктор:', numbers.length, Array.length)
numbers.length = 1
console.log('После уменьшения:', numbers, 1 in numbers)
numbers.length = 4
console.log('После увеличения:', numbers.length, 1 in numbers)
console.log('Существующие индексы:', Object.keys(numbers))

Как сортировать и менять копию массива

Измените числа или индекс в with(). Сравните строковую и числовую сортировку, новые массивы и исходный массив после sort().

index.html
HTML
<!doctype html>
<html lang="ru">
  <head>
    <meta charset="utf-8" />
    <title>Как сортировать и менять копию массива</title>
  </head>
  <body></body>
</html>
main.js
JavaScript
const numbers = [20, 3, 100]
console.log('Строковая сортировка:', numbers.toSorted())
console.log(
    'Числовая сортировка:',
    numbers.toSorted((a, b) => a - b)
)
console.log('Обратная копия:', numbers.toReversed())
console.log('Замена последнего:', numbers.with(-1, 7))
console.log('Удаление из копии:', numbers.toSpliced(1, 1))
console.log('Исходный до sort:', numbers)
// В отличие от toSorted(), sort() изменяет исходный массив.
numbers.sort((a, b) => a - b)
console.log('Исходный после sort:', numbers)

Измените условие number > 3 или глубину flat(1). Сравните найденное значение и индекс, а также результат flat() и flatMap().

index.html
HTML
<!doctype html>
<html lang="ru">
  <head>
    <meta charset="utf-8" />
    <title>Как найти последнее совпадение и раскрыть вложенные массивы</title>
  </head>
  <body></body>
</html>
main.js
JavaScript
const numbers = [2, 5, 4, 1]
console.log('Последний элемент:', numbers.at(-1))
console.log(
    'Последнее совпадение:',
    numbers.findLast((number) => number > 3)
)
console.log(
    'Индекс совпадения:',
    numbers.findLastIndex((number) => number > 3)
)
console.log('Значения итератора:', [...numbers.values()])
const nested = [
    [1, 2],
    [3, [4]],
]
console.log('Раскрытие на один уровень:', nested.flat(1))
// Каждый элемент превращается в пару, затем пары раскрываются на один уровень.
console.log(
    'Пары чисел:',
    numbers.flatMap((number) => [number, number * 10])
)

Как получить массив из асинхронного источника

Измените значения yield или множитель. Array.fromAsync() вернёт Promise; готовый массив появится после его завершения.

index.html
HTML
<!doctype html>
<html lang="ru">
  <head>
    <meta charset="utf-8" />
    <title>Как получить массив из асинхронного источника</title>
  </head>
  <body></body>
</html>
main.js
JavaScript
async function* values() {
    yield 2
    yield 5
}
// Результат преобразования каждого элемента ожидается перед следующим шагом.
Array.fromAsync(values(), async (number) => number * 10)
    .then((result) => console.log('Готовый массив:', result))
    .catch((error) => console.error(error.message))