Массивы
Чему вы научитесь:
- читать и заменять элемент по индексу и узнавать длину массива;
- добавлять и удалять элементы в начале и в конце массива;
- копировать часть массива через
slice, вырезать элементы черезspliceи находить элемент черезindexOf; - объяснять, почему две переменные могут указывать на один массив, и делать отдельную копию.
![Ряд из трёх ячеек scores; в среднюю, scores[1], кладут плитку 2 вместо прежней](/course-covers/javascript-beginners/08-arrays.webp)
Представьте камеру хранения на вокзале: ряд одинаковых ячеек, и на каждой написан номер. Чтобы забрать вещь, не нужно открывать все ячейки подряд. Достаточно знать номер и подойти прямо к нужной.
Массив устроен так же. Как вы уже знаете из цикла for…of, массив — это список значений по порядку, записанный в квадратных скобках через запятую. Каждое значение — элемент, а его номер — индекс. Номера в этой камере хранения начинаются с 0, а не с 1.
Перебирать элементы по порядку вы уже умеете. Но часто нужен один элемент: третий результат, последнее сообщение, первый игрок. Массив умеет и это: он знает, сколько в нём элементов, отдаёт любой элемент по индексу и позволяет его заменить:
const scores = [5, 3, 4];
console.log(scores.length); // 3
console.log(scores[0], scores[2]); // 5 4
console.log(scores[3]); // undefined
console.log(scores[scores.length - 1]); // 4
scores[1] = 2;
console.log(scores.join(" ")); // 5 2 4Давайте разберём программу по строкам:
scoresполучает массив из трёх оценок.scores.lengthпечатает3— число элементов.scores[0]иscores[2]достают первый и третий элементы:5и4.scores[3]печатаетundefined: ячейки с номером3нет.scores[scores.length - 1]достаёт последний элемент,4.scores[1] = 2кладёт2на место второго элемента.scores.join(" ")печатает5 2 4: вторая оценка заменена.
Длина и индексы
Свойство length хранит число элементов массива. У пустого массива [] длина 0. Индексы считают с 0, поэтому последний элемент — scores[scores.length - 1].
Индекс за концом массива ошибки не вызывает: выражение scores[3] даёт undefined. Так же ведёт себя строка, когда индекс выходит за её конец.
В одном массиве могут лежать значения разных типов: [1, "one", true] — массив из трёх элементов. Обычно же элементы одного типа, например только числа или только строки.
Замена элемента
В отличие от строки, массив можно изменить. Присваивание scores[1] = 2 кладёт на место второго элемента новое значение, а длина остаётся прежней. Это как положить в ячейку номер 1 другую вещь: ряд ячеек остался тем же.
Массив в константе scores тоже меняется. const запрещает присвоить имени scores другой массив, но не запрещает менять элементы самого массива.
Здесь аналогия с камерой хранения заканчивается. Ряд настоящих ячеек не растёт и не сокращается, а массив может становиться длиннее и короче.
Печать и проверка
Node.js печатает массив целиком, в квадратных скобках. Давайте посмотрим, как ещё превратить массив в строку и как проверить, массив ли перед вами:
const words = ["red", "green"];
console.log(words); // [ 'red', 'green' ]
console.log(words.join(" + ")); // red + green
console.log(words.join()); // red,green
console.log(typeof words); // object
console.log(Array.isArray(words), Array.isArray("red")); // true falseМетод join
Чтобы получить из массива одну строку, вызовите метод join. Он склеивает элементы через переданный разделитель, а без аргумента — через запятую. Сам массив join не меняет: он возвращает новую строку, и числа попадают в неё как текст.
typeof и Array.isArray
Оператор typeof для массива даёт "object" — тот же ответ, что и для null, поэтому по typeof массив не распознать. Своего названия типа у массива нет: typeof не отличает массив от других значений типа "object".
Проверить, массив ли перед вами, помогает функция Array.isArray: она возвращает true только для массива. Для строки "red" она даёт false, хотя у строки тоже есть индексы и длина.
Частая ошибка
Цикл по индексам дошёл до nums.length включительно:
const nums = [2, 4, 6];
let total = 0;
for (let i = 0; i <= nums.length; i++) { // ✗
total += nums[i];
}Ошибки нет, но total равен NaN, а не 12. На последнем шаге i равно 3, а nums[3] — это undefined. Сумма с undefined даёт NaN.
Последний индекс на единицу меньше длины, поэтому условие пишут как i < nums.length. Если индекс не нужен, перебирайте элементы через for…of.
Главное
- Индексы массива начинаются с
0, последний элемент —a[a.length - 1], а индекс за концом даётundefined. - Присваивание
a[i] = xменяет элемент на месте, даже если массив лежит в константе. joinсклеивает элементы в новую строку и не меняет массив.typeofдля массива даёт"object", а проверяют массив черезArray.isArray.
Подпишись, чтобы пройти курс
Курс бесплатный. Войди через Telegram и подпишись на канал — откроются все уроки.