Введение: Что такое массив и зачем он нужен?
Представь, что у тебя есть рюкзак, в который можно положить много разных вещей: книги, тетради, ручку, яблоко и наушники. В программировании такой "рюкзак" называется массивом (от английского array — "массив", "набор").
Массив — это специальная структура данных, которая позволяет хранить много значений в одной переменной. Без массивов нам пришлось бы создавать отдельную переменную для каждого элемента:
// Без массива — неудобно!
let книга1 = "Гарри Поттер";
let книга2 = "Властелин колец";
let книга3 = "Маленький принц";
// А если книг 100? Придется писать 100 переменных!
С массивами всё проще:
// С массивом — удобно!
let книги = ["Гарри Поттер", "Властелин колец", "Маленький принц"];
Массивы используются везде: в играх (список врагов, инвентарь персонажа), в приложениях (список контактов, сообщений), на сайтах (каталог товаров, галерея изображений). Сегодня мы научимся создавать массивы, добавлять и удалять элементы, а также проходить по всем элементам с помощью циклов.
1. Создание массива
Массив создается с помощью квадратных скобок []. Внутри скобок элементы перечисляются через запятую. Элементами могут быть любые типы данных: числа, строки, булевы значения, даже другие массивы!
Пример 1: Массив чисел (оценки ученика)
// Оценки по предметам за четверть
let оценки = [5, 4, 5, 3, 5, 4, 5];
// Индексы: 0 1 2 3 4 5 6
// В массиве 7 элементов
Пример 2: Массив строк (список друзей)
// Имена друзей в телефонной книге
let друзья = ["Анна", "Борис", "Виктор", "Галина"];
// Индексы: 0 1 2 3
Пример 3: Смешанный массив (разные типы)
// Информация о пользователе
let пользователь = ["Иван", 14, true, "ivan@mail.ru"];
// [имя, возраст, активен?, email]
// Типы: строка, число, булево, строка
Важно! Нумерация элементов в массиве начинается с нуля. Первый элемент имеет индекс 0, второй — 1, и так далее. Это называется нулевая индексация.
2. Доступ к элементам массива
Чтобы получить значение элемента, нужно написать имя массива и в квадратных скобках указать его индекс:
let фрукты = ["яблоко", "банан", "апельсин", "киви"];
console.log(фрукты[0]); // "яблоко" (первый элемент)
console.log(фрукты[2]); // "апельсин" (третий элемент)
console.log(фрукты[3]); // "киви" (четвертый элемент)
// Если указать индекс, которого нет, получим undefined
console.log(фрукты[10]); // undefined (нет такого элемента)
Свойство length — длина массива
У каждого массива есть свойство length, которое показывает количество элементов:
let цвета = ["красный", "зеленый", "синий", "желтый"];
console.log(цвета.length); // 4
// Последний элемент всегда имеет индекс (length - 1)
console.log(цвета[цвета.length - 1]); // "желтый"
3. Изменение элементов массива
Массивы можно изменять — присваивать новое значение по индексу:
let дни = ["пн", "вт", "ср", "чт", "пт", "сб", "вс"];
// Заменим "ср" на "среда"
дни[2] = "среда";
console.log(дни); // ["пн", "вт", "среда", "чт", "пт", "сб", "вс"]
// Можно добавить элемент, если индекс больше длины
дни[7] = "выходной";
console.log(дни); // ["пн", "вт", "среда", "чт", "пт", "сб", "вс", "выходной"]
Внимание: Если присвоить значение по индексу, который намного больше длины массива, между существующими и новым элементом образуются "пустые" места (empty). Старайся так не делать!
4. Основные методы массивов
У массивов есть встроенные методы — готовые функции, которые помогают управлять данными. Рассмотрим самые полезные.
4.1. Добавление элементов
push() — добавляет элемент в конец массива:
let очередь = ["Иван", "Мария", "Петр"];
очередь.push("Анна");
console.log(очередь); // ["Иван", "Мария", "Петр", "Анна"]
// Можно добавить сразу несколько элементов
очередь.push("Ольга", "Сергей");
console.log(очередь); // ["Иван", "Мария", "Петр", "Анна", "Ольга", "Сергей"]
unshift() — добавляет элемент в начало массива:
let числа = [2, 3, 4];
числа.unshift(1);
console.log(числа); // [1, 2, 3, 4]
// Тоже можно несколько
числа.unshift(-1, 0);
console.log(числа); // [-1, 0, 1, 2, 3, 4]
4.2. Удаление элементов
pop() — удаляет последний элемент и возвращает его:
let корзина = ["молоко", "хлеб", "яйца", "сок"];
let последний = корзина.pop();
console.log(последний); // "сок"
console.log(корзина); // ["молоко", "хлеб", "яйца"]
shift() — удаляет первый элемент и возвращает его:
let маршрут = ["дом", "школа", "парк", "магазин"];
let первый = маршрут.shift();
console.log(первый); // "дом"
console.log(маршрут); // ["школа", "парк", "магазин"]
4.3. Поиск элементов
indexOf() — возвращает индекс первого найденного элемента или -1, если элемент не найден:
let звери = ["кот", "собака", "попугай", "кот", "хомяк"];
console.log(звери.indexOf("кот")); // 0 (первое вхождение)
console.log(звери.indexOf("собака")); // 1
console.log(звери.indexOf("тигр")); // -1 (не найден)
// Второй параметр — с какого индекса начинать поиск
console.log(звери.indexOf("кот", 1)); // 3 (начиная с индекса 1)
includes() — проверяет, есть ли элемент в массиве (возвращает true/false):
let игры = ["Майнкрафт", "Террария", "Роблокс"];
console.log(игры.includes("Майнкрафт")); // true
console.log(игры.includes("Fortnite")); // false
4.4. Удаление и замена элементов (splice)
splice() — универсальный метод. Он может удалять, добавлять и заменять элементы. Первый параметр — начальный индекс, второй — сколько элементов удалить, остальные — что добавить.
let цвета = ["красный", "зеленый", "синий", "желтый"];
// Удаляем 1 элемент с индекса 2 (удаляем "синий")
let удаленные = цвета.splice(2, 1);
console.log(удаленные); // ["синий"]
console.log(цвета); // ["красный", "зеленый", "желтый"]
// Заменяем "зеленый" на "фиолетовый" (удаляем 1 элемент и добавляем 1)
цвета.splice(1, 1, "фиолетовый");
console.log(цвета); // ["красный", "фиолетовый", "желтый"]
// Добавляем "оранжевый" на позицию 1 (удаляем 0 элементов)
цвета.splice(1, 0, "оранжевый");
console.log(цвета); // ["красный", "оранжевый", "фиолетовый", "желтый"]
4.5. Объединение массивов (concat)
concat() — создает новый массив, объединяя два или более массивов:
let мальчики = ["Иван", "Петр", "Алексей"];
let девочки = ["Анна", "Мария", "Елена"];
let всеДети = мальчики.concat(девочки);
console.log(всеДети); // ["Иван", "Петр", "Алексей", "Анна", "Мария", "Елена"]
// Можно объединять не только массивы, но и отдельные элементы
let числа1 = [1, 2];
let числа2 = числа1.concat(3, 4, [5, 6]);
console.log(числа2); // [1, 2, 3, 4, 5, 6]
5. Перебор элементов массива (циклы)
Очень часто нужно выполнить какое-то действие с каждым элементом массива. Для этого используют циклы.
5.1. Цикл for с индексами
Классический способ — использовать цикл for от 0 до length - 1:
let температуры = [22, 25, 19, 30, 27, 23, 20];
// Выводим каждую температуру с номером дня
for (let i = 0; i < температуры.length; i++) {
console.log("День " + (i + 1) + ": " + температуры[i] + "°C");
}
// Результат:
// День 1: 22°C
// День 2: 25°C
// ... и так далее
5.2. Цикл for...of (для элементов)
Более современный способ, если не нужны индексы, а только сами элементы:
let студенты = ["Аня", "Боря", "Витя", "Гоша"];
for (let имя of студенты) {
console.log("Привет, " + имя + "!");
}
// Привет, Аня!
// Привет, Боря!
// Привет, Витя!
// Привет, Гоша!
5.3. Практический пример: подсчет суммы
// Подсчитываем сумму всех чисел в массиве
let числа = [10, 20, 30, 40, 50];
let сумма = 0;
for (let i = 0; i < числа.length; i++) {
сумма = сумма + числа[i]; // можно сократить: сумма += числа[i]
}
console.log("Сумма чисел: " + сумма); // Сумма чисел: 150
6. Многомерные массивы (массивы внутри массивов)
Иногда нужно хранить табличные данные. Например, поле для игры в морской бой или шахматную доску. Для этого создают массив массивов — двумерный массив.
// Таблица умножения 3x3
let таблица = [
[1, 2, 3], // строка 0
[4, 5, 6], // строка 1
[7, 8, 9] // строка 2
];
// Доступ к элементу: сначала строка, потом столбец
console.log(таблица[0][0]); // 1 (первая строка, первый столбец)
console.log(таблица[1][2]); // 6 (вторая строка, третий столбец)
console.log(таблица[2][1]); // 8 (третья строка, второй столбец)
// Перебор двумерного массива (вложенные циклы)
for (let строка = 0; строка < таблица.length; строка++) {
for (let столбец = 0; столбец < таблица[строка].length; столбец++) {
console.log("Элемент [" + строка + "][" + столбец + "] = " + таблица[строка][столбец]);
}
}
7. Полезные методы: sort, reverse, join
7.1. sort() — сортировка
Сортирует элементы как строки (по алфавиту):
let имена = ["Даша", "Антон", "Борис", "Глеб"];
имена.sort();
console.log(имена); // ["Антон", "Борис", "Глеб", "Даша"]
// Для чисел нужно передать функцию сравнения
let цифры = [10, 5, 100, 3, 25];
цифры.sort(function(a, b) { return a - b; }); // по возрастанию
console.log(цифры); // [3, 5, 10, 25, 100]
7.2. reverse() — обратный порядок
let буквы = ["а", "б", "в", "г"];
буквы.reverse();
console.log(буквы); // ["г", "в", "б", "а"]
7.3. join() — склеивание в строку
let слова = ["JavaScript", "это", "круто"];
let предложение = слова.join(" "); // разделитель — пробел
console.log(предложение); // "JavaScript это круто"
let дата = ["2024", "12", "31"];
console.log(дата.join("-")); // "2024-12-31"
8. Жизненные аналогии
Аналогия с почтовыми ящиками: Представь, что массив — это ряд почтовых ящиков в подъезде. У каждого ящика есть номер (индекс), и в каждом лежит письмо (значение). Чтобы прочитать письмо, нужно знать номер ящика. Чтобы положить новое письмо, нужно открыть нужный ящик.
Аналогия с поездом: Массив — это поезд, где каждый вагон — элемент. У вагонов есть номера (индексы). Ты можешь зайти в любой вагон (получить элемент), можешь прицепить новый вагон в конец (push) или в начало (unshift), можешь отцепить последний вагон (pop) или первый (shift).
9. Примеры из реальных проектов
Пример: Список покупок
let покупки = ["молоко", "хлеб", "яйца", "масло"];
// Добавляем новый товар
покупки.push("сыр");
// Удаляем "хлеб" (находим его индекс)
let индекс = покупки.indexOf("хлеб");
if (индекс !== -1) {
покупки.splice(индекс, 1);
}
console.log(покупки); // ["молоко", "яйца", "масло", "сыр"]
// Выводим список покупок
console.log("Список покупок:");
for (let товар of покупки) {
console.log("- " + товар);
}
Пример: Средняя оценка ученика
let оценки = [4, 5, 3, 5, 4, 4, 5, 3];
let сумма = 0;
for (let i = 0; i < оценки.length; i++) {
сумма += оценки[i];
}
let средняя = сумма / оценки.length;
console.log("Средняя оценка: " + средняя.toFixed(1)); // toFixed округляет до 1 знака
// Находим максимальную оценку
let максимум = оценки[0];
for (let i = 1; i < оценки.length; i++) {
if (оценки[i] > максимум) {
максимум = оценки[i];
}
}
console.log("Лучшая оценка: " + максимум);
10. Частые ошибки новичков
- Путаница с индексами: Помни, что первый элемент — индекс 0, последний — длина минус 1.
- Выход за границы массива: Если обратиться к несуществующему индексу, получишь
undefined. - Забыл про let/const: Массив, объявленный через
const, нельзя переприсвоить, но можно менять его содержимое. - Сравнение массивов: Два массива с одинаковыми элементами — это разные объекты.
[1,2] === [1,2]дастfalse.
11. Практические задания
Теперь твоя очередь! Выполни эти задания в редакторе кода (например, в консоли браузера или на сайте вроде CodePen).
Задание 1: Управление списком дел
Создай массив дела с тремя строками: "Убраться в комнате", "Сделать уроки", "Погулять с собакой". Затем:
- Добавь в начало новое дело "Позавтракать".
- Удали последнее дело.
- Замени "Сделать уроки" на "Выучить JavaScript".
- Выведи итоговый массив в консоль.
Ожидаемый результат: ["Позавтракать", "Убраться в комнате", "Выучить JavaScript"]
Задание 2: Поиск чисел
Дан массив чисел: [12, 45, 7, 89, 23, 56, 34, 90, 11, 67]. Напиши код, который:
- Находит и выводит сумму всех чисел.
- Находит и выводит самое маленькое число.
- Создает новый массив только из четных чисел (используй цикл и условие).
Подсказка: проверка на четность — число % 2 === 0
Задание 3: Игра "Угадай число"
Создай массив из 10 случайных чисел от 1 до 100 (используй Math.random()). Затем:
- Выведи массив в консоль.
- Попроси пользователя ввести число (через
prompt). - Проверь, есть ли это число в массиве (используй
includes). - Если есть — выведи "Угадал!", если нет — "Попробуй еще раз".
Для генерации случайного числа: Math.floor(Math.random() * 100) + 1
Совет: После выполнения заданий попробуй изменить код и посмотреть, что получится. Экспериментируй! Массивы — одна из самых важных тем в программировании. Освоив их, ты сможешь создавать гораздо более сложные и интересные программы.
В следующем уроке мы научимся использовать функции для работы с массивами — это сделает код еще более мощным и удобным. А пока — тренируйся!