Перейти к содержимому
Теория · Массивы · урок 1 из 13

Массивы

Чему вы научитесь

Чему вы научитесь:

  • читать и заменять элемент по индексу и узнавать длину массива;
  • добавлять и удалять элементы в начале и в конце массива;
  • копировать часть массива через slice, вырезать элементы через splice и находить элемент через indexOf;
  • объяснять, почему две переменные могут указывать на один массив, и делать отдельную копию.
Ряд из трёх ячеек scores; в среднюю, scores[1], кладут плитку 2 вместо прежней

Представьте камеру хранения на вокзале: ряд одинаковых ячеек, и на каждой написан номер. Чтобы забрать вещь, не нужно открывать все ячейки подряд. Достаточно знать номер и подойти прямо к нужной.

Массив устроен так же. Как вы уже знаете из цикла for…of, массив — это список значений по порядку, записанный в квадратных скобках через запятую. Каждое значение — элемент, а его номер — индекс. Номера в этой камере хранения начинаются с 0, а не с 1.

Перебирать элементы по порядку вы уже умеете. Но часто нужен один элемент: третий результат, последнее сообщение, первый игрок. Массив умеет и это: он знает, сколько в нём элементов, отдаёт любой элемент по индексу и позволяет его заменить:

JavaScript
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

Давайте разберём программу по строкам:

  1. scores получает массив из трёх оценок.
  2. scores.length печатает 3 — число элементов.
  3. scores[0] и scores[2] достают первый и третий элементы: 5 и 4.
  4. scores[3] печатает undefined: ячейки с номером 3 нет.
  5. scores[scores.length - 1] достаёт последний элемент, 4.
  6. scores[1] = 2 кладёт 2 на место второго элемента.
  7. 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 печатает массив целиком, в квадратных скобках. Давайте посмотрим, как ещё превратить массив в строку и как проверить, массив ли перед вами:

JavaScript
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 включительно:

JavaScript
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 и подпишись на канал — откроются все уроки.

Войти другим способом