Что такое массив — и почему в нём считают с нуля

Открой любое приложение, которым пользуешься. Лента, переписка, корзина, результаты поиска, список задач. Внешне — разные экраны. Внутри — одна и та же штука: массив.
И у неё есть привычка, которая ломает мозг в первый день: в массиве из четырёх элементов последний номер — три. Не опечатка. Сейчас объясню, почему так сделали и какая ошибка из этого растёт.
Что такое массив
Массив — это несколько значений, сложенных в одну коробку по порядку.
Обычная переменная хранит одно значение: const city = "Алматы". Массив хранит много и помнит, кто за кем стоит:
const cart = ["чай", "мёд", "лимон"]
Порядок здесь — не украшение, а часть данных. Переставишь элементы — получится другой массив, хотя значения те же. Именно поэтому лента не перемешивается при каждом открытии: порядок записан вместе с содержимым.
Чтобы достать элемент, называешь его номер — индекс:
cart[0] // "чай"
cart[2] // "лимон"
Почему счёт идёт с нуля
Вот главный трюк: индекс — это не «который по счёту». Индекс — это на сколько шагов отойти от начала.
Первый элемент лежит в самом начале. Шагать никуда не надо — ноль шагов. Второй — один шаг. Третий — два. Счёт с нуля выглядит странно ровно до момента, когда посмотришь на него как на расстояние, а не на порядковый номер.
Это не случайная причуда языка. Ещё в 1982 году Эдсгер Дейкстра написал заметку ровно об этом — почему нумеровать разумнее с нуля. Сегодня так считают JavaScript, Python, Java, C, Go. С единицы — Lua, R, MATLAB и 1С. Так что если увидишь в чужом примере list[1] и он достаёт первый элемент — просто другой язык, а не ошибка.
А теперь практическая часть. У массива есть длина:
cart.length // 3
Длина — три, а индексы — 0, 1, 2. Последний индекс всегда на единицу меньше длины. Обратиться к cart[3] можно, ошибки не будет — просто вернётся undefined, пустота.
Это и есть off-by-one — «ошибка на единицу». Она коварная: код не падает, просто в конце списка появляется пустая строчка или на экране пропадает последний элемент.
Что с массивом делают
Четыре действия покрывают почти весь код, который ИИ пишет тебе для списков:
- Добавить в конец —
cart.push("имбирь"). Массив становится длиннее на один. - Пройти по всем — это цикл: взять каждый элемент по очереди.
- Отсеять лишнее —
filter. Из старого массива получается новый, только с подходящими элементами. - Превратить в другое —
map. Каждый элемент заменяется на что-то своё.
Последнее — тот самый приём, который делает экраны. Когда в React-коде ты видишь items.map(...), это буквально «возьми список данных и преврати каждую запись в карточку на экране». Массив из пяти товаров превращается в пять карточек. Добавился шестой — появилась шестая, без единой правки в разметке.
Заметь, что filter и map не трогают исходный массив, а делают новый. Поэтому в коде так часто встречаются цепочки вроде items.filter(...).map(...) — каждый шаг отдаёт следующему свежий список.
Пустой массив — это ответ, а не поломка
Массив может быть пустым: []. Длина ноль, элементов нет.
Новички читают это как ошибку — а это нормальный, честный ответ. «Ничего не найдено», «заказов пока нет», «чат чистый» — за всеми этими экранами стоит массив нулевой длины. Никто не сломался: поиск отработал и вернул ноль совпадений.
Разница важна на практике. [] — это «есть список, в нём ничего». undefined — это «списка вообще нет, данные не дошли». Первое лечится текстом «пока пусто», второе — загрузкой или починкой запроса. Если у тебя на экране пусто, а ошибок нет, начни разбираться отсюда — причины у пустого массива всего две-три, и они типовые.
Практический вывод: когда просишь ИИ сделать экран со списком, добавляй в промпт «покажи, что будет при пустом списке». Модель почти всегда пишет случай «данные есть» и почти никогда — «данных ноль». А пользователь увидит именно его в первый день.
Массив и список — это одно и то же?
В разговоре — да. В Python эта штука так и называется list, в JavaScript — Array. Разные имена одной идеи: значения, лежащие по порядку, доступные по номеру.
Можно ли положить в массив разное — числа и текст вместе?
В JavaScript и Python — можно, язык не возражает. Но на практике так почти не делают: весь код, который читает такой массив, вынужден каждый раз проверять, что ему попалось. Один массив — один тип вещей.
Короткие уроки-истории, симулятор агента и ежедневная практика — в нашем мобильном приложении. Бесплатно.





