JavaScript массивы
Array хранит упорядоченную коллекцию значений. Индексы начинаются с нуля; элементы могут иметь разные
типы. Свойство length задаёт длину, но в массиве могут быть пустые позиции — индексы без элемента.
Массив обычно создают литералом [1, 2, 3]. Конструктор Array() с единственным числовым
аргументом задаёт длину, а не значение элемента. Сравните способы создания в
примере создания массива.
Методы массивов
Ниже перечислены собственные статические методы Array и методы его прототипа
Array.prototype, доступные экземплярам. Унаследованные методы Object и
Function в таблицы не включены. Конструктор и свойства не являются методами экземпляра.
Статические методы Array
Вызываются у конструктора, например Array.isArray(value), а не у отдельного массива. Получение массива из
асинхронного источника показано в
примере Array.fromAsync().
| Метод | Описание |
|---|---|
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.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 lang="ru">
<head>
<meta charset="utf-8" />
<title>Чем Array(3) отличается от Array.of(3)</title>
</head>
<body></body>
</html>
main.js
// Один числовой аргумент конструктора задаёт длину, но не создаёт элементы.
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 lang="ru">
<head>
<meta charset="utf-8" />
<title>Как сортировать и менять копию массива</title>
</head>
<body></body>
</html>
main.js
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 lang="ru">
<head>
<meta charset="utf-8" />
<title>Как найти последнее совпадение и раскрыть вложенные массивы</title>
</head>
<body></body>
</html>
main.js
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 lang="ru">
<head>
<meta charset="utf-8" />
<title>Как получить массив из асинхронного источника</title>
</head>
<body></body>
</html>
main.js
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))