ОСНОВЫ JAVASCRIPT

Ты не учишься писать код. Ты учишься читать его — чтобы понимать, что сгенерировала нейросеть, где ошибка и что просить исправить.

0

Где живёт JavaScript

HTML — каркас страницы. JS — логика. Одно без другого не работает.

HTML — это скелет страницы. Текст, картинки, кнопки — всё это HTML. Но HTML статичный — он не умеет реагировать на действия. Нажал кнопку — ничего не произойдёт. JavaScript добавляет логику: «когда нажали кнопку — сделай вот это». JS-код подключается к HTML через тег <script> или отдельный файл. Браузер читает HTML сверху вниз, находит скрипт и выполняет его.

const counter = document.getElementById('click-counter');
const btn = document.getElementById('click-btn');
let clicks = 0;

btn.addEventListener('click', () => {
  clicks = clicks + 1;
  counter.textContent = clicks;
});
document.getElementById('click-counter')
Ищет на странице элемент с id="click-counter". Нашёл — запомнил в переменную counter. Теперь через counter можно менять этот элемент.
document.getElementById('click-btn')
Находит кнопку по id. Сохраняет в переменную btn. Дальше на неё повесим обработчик клика.
let clicks = 0
Переменная-счётчик. Начинает с нуля. let — потому что значение будет меняться при каждом клике.
btn.addEventListener('click', () => { })
Вешает на кнопку реакцию: при клике выполни код в фигурных скобках. () => { } — стрелочная функция, вызывается автоматически при каждом клике.
clicks = clicks + 1
Берёт текущее значение clicks, прибавляет 1, записывает обратно. Если было 0, стало 1.
counter.textContent = clicks
Обновляет текст элемента на экране. Пользователь видит новое число.
🖱️
Кликов: 0
Задание: первый скрипт
вывод
...
1

Переменные

Хранят данные: имя, возраст, счёт. Без них программа ничего не запоминает.

Переменная — это коробка с надписью. Внутри лежат данные: число, текст, список. Надпись на коробке — имя переменной. По имени ты обращаешься к данным.

Два ключевых слова: const и let. const — коробка запечатана. Положил данные — больше не заменишь. let — коробка открыта. Данные можно заменить на другие.

Когда что использовать? По умолчанию пиши const. Если значение реально будет меняться (счётчик, состояние) — let.

🔒
const
Константа. Присвоил — и всё.
const pi = 3.14 const name = "Капи"
Когда: имена, настройки, ID, конфиги
🔄
let
Переменная. Значение можно менять.
let score = 0 score = score + 1
Когда: счётчики, состояния, всё что обновляется
const name = "Капи";     // имя не изменится
let age = 3;              // возраст растёт

age = age + 1;

console.log(name);  // Капи
console.log(age);   // 4
const name = "Капи"
const — константа. Присвоил и больше не перезаписываешь. Для имён, настроек, ID.
let age = 3
let — изменяемая переменная. Для счётчиков, состояний, всего, что будет обновляться.
age = age + 1
Берёт текущее значение (3), прибавляет 1, записывает обратно. Стало 4.
console.log(name)
Выводит значение переменной name в консоль. Покажет «Капи».
console.log(age)
Выводит текущее значение age. После age = age + 1 покажет 4.
правило

По умолчанию пиши const. Если значение реально меняется — let.

camelCase — стиль именования

В JS имена переменных и функций пишут слитно: первое слово с маленькой буквы, каждое следующее — с большой. capybaraName, isHungry, getElementById. Это называется camelCase — «горбатый регистр», потому что заглавные буквы торчат как горбы верблюда.

Когда видишь длинное слово типа addEventListener — разбей на части: add + Event + Listener = «добавь слушатель событий». Так читаешь любой код.

🦫

Капи // const

Возраст: 3 // let

Задание: исправь ошибки
вывод
...
1.5

Типы данных

Строка, число, true/false — JS различает типы. От типа зависит, что можно делать с данными.

У каждого значения есть тип. Тип определяет, что с этим значением можно делать.

«Капи» — это строка (string). Текст в кавычках. Можно склеивать строки, искать символы, считать длину.

3 — это число (number). Целые и дробные. Можно складывать, вычитать, сравнивать.

true / false — это boolean. Логический тип. Всего два значения: да или нет. Используется в условиях: если true — делаем одно, если false — другое.

Важно: "3" (в кавычках) — это строка, а не число. Кавычки превращают что угодно в текст. typeof покажет тип любого значения.

📝
string
Текст в кавычках.
"Капи" 'привет' `шаблон ${x}`
Можно: склеить, найти длину, вставить переменную
🔢
number
Целые и дробные.
42 3.14 -7
Можно: складывать, вычитать, сравнивать
boolean
true или false. Вкл/выкл, да/нет.
true false
Результат сравнения: 5 > 3 → true
const name = "Капи";         // строка
const age = 3;              // число
const isHungry = true;      // boolean

typeof name     // "string"
typeof age      // "number"
typeof isHungry // "boolean"
"Капи"
Кавычки = строка. Двойные, одинарные, обратные — всё работает. Тип: string.
3
Число без кавычек. "3" — уже строка. Кавычки решают тип.
true
Без кавычек. Только два значения: true и false. Для условий и флагов.
typeof name
Оператор typeof показывает тип значения. Для строки вернёт "string".
typeof age
Для числа typeof вернёт "number". Целые и дробные — всё number.
typeof isHungry
Для true или false typeof вернёт "boolean".
ловушка

"5" + 3 = "53", а не 8. Строка + число = склейка. Число + число = математика.

🧩 Перетащи значения в правильный тип

"Капи"
42
true
"привет"
3.14
false
string
number
boolean
2

Шаблонные строки

Способ вставлять переменные прямо в текст без склейки через +.

Когда нужно вставить переменную в текст, есть два способа. Старый: склейка через +. Неудобно — легко потерять пробел или кавычку. Новый: обратные кавычки ` и ${переменная} внутри. Читается как обычное предложение. ИИ генерирует так почти всегда.

Обратные кавычки — это не одинарные и не двойные. На клавиатуре — левый верхний угол, клавиша с тильдой ~ (на русской раскладке там Ё). Только в обратных кавычках работает ${}.

const name = "Капибара";
let score = 100;

// старый способ
console.log("Игрок " + name + " набрал " + score);

// новый — читается как обычное предложение
console.log(`Игрок ${name} набрал ${score} очков`);
const name = "Капибара"
Обычная строка в двойных кавычках. Сохраняем имя в константу.
let score = 100
Числовая переменная. let — потому что счёт будет меняться.
"Игрок " + name + " набрал " + score
Старый способ — склейка строк через +. Работает, но легко потерять пробел или кавычку.
`Игрок ${name} набрал ${score} очков`
Обратные кавычки включают режим шаблона. Всё внутри ${} заменяется на значение переменной. Чище и понятнее.
🎮
Игрок Капибара набрал 100 очков
Задание: перепиши на шаблонную строку
вывод
...
3

Функции

Набор команд с именем. Один раз написал — вызываешь сколько угодно раз с разными данными.

Представь рецепт. Записал один раз «сварить борщ» — и каждый раз готовишь по нему, не вспоминая шаги заново. Функция работает так же: набор команд под одним именем. Вызвал по имени — команды выполнились.

У функции бывают параметры — пустые слоты для данных. Вызываешь функцию и передаёшь конкретные значения. Функция работает с ними и может вернуть результат через return.

Стрелочная запись: const feed = (food) => { ... } — то же самое, что function feed(food) { ... }, но короче. ИИ часто пишет именно так. => читается как «делает».

function feedCapybara(food, calories) {
  console.log(`Капибара съела ${food}`);
  return calories;
}

feedCapybara("Траву", 1);   // Капибара съела Траву
feedCapybara("Арбуз", 5);  // Капибара съела Арбуз
function feedCapybara(food, calories)
Создаёт функцию с именем feedCapybara. food и calories — параметры. Пустые слоты, которые заполнятся при вызове.
console.log(`Капибара съела ${food}`)
Тело функции. При вызове food заменится на конкретное значение, переданное в параметр.
return calories
Возвращает результат наружу. Без return функция ничего не отдаёт вызывающему коду.
feedCapybara("Траву", 1)
Вызов функции. "Траву" попадёт в параметр food, 1 — в calories.
feedCapybara("Арбуз", 5)
Второй вызов с другими данными. Та же функция — новые аргументы. Выведет «Капибара съела Арбуз».
стрелочная запись

ИИ часто пишет const feed = (food) => { ... }. Это то же самое, что function feed(food) { ... }, только короче. => читается как «делает».

🦫

Вес: 45 кг

Задание: перепиши на стрелочную
вывод
...
4

Массивы

Пронумерованный список значений. Нумерация с нуля.

Массив — это пронумерованный список. Как полка с ячейками: в каждой ячейке лежит что-то, и у каждой есть номер.

Нумерация начинается с нуля, не с единицы. Первый элемент — [0], второй — [1]. Это правило, к нему привыкаешь.

Зачем массивы? Хранить списки: товары в корзине, сообщения в чате, пользователей в таблице. Без массивов пришлось бы создавать отдельную переменную для каждого элемента.

let backpack = ["Мандаринка", "Яблоко"];

backpack.push("Трава");       // добавить в конец
console.log(backpack[0]);     // Мандаринка
console.log(backpack.length); // 3
backpack.pop();               // убрать последний
["Мандаринка", "Яблоко"]
Квадратные скобки создают массив. Элементы через запятую. Индекс 0 — «Мандаринка», индекс 1 — «Яблоко».
.push("Трава")
Добавляет элемент в конец массива. Теперь в backpack три элемента.
backpack[0]
Первый элемент. Нумерация с нуля, не с единицы. [0] — «Мандаринка».
.length
Количество элементов в массиве. Свойство, не метод — без скобок.
.pop()
Убирает последний элемент и возвращает его. Массив стал короче на один.
🎒
🍊 Мандаринка

Предметов: 1

Задание: рюкзак
вывод
...
5

Объекты

Набор свойств с именами. Как карточка персонажа: имя, роль, статус.

Объект — набор свойств с именами. Если массив — это полка с номерами, то объект — это анкета: имя, возраст, роль. У каждого свойства есть ключ (имя) и значение.

Обращаешься через точку: capybara.name — «у объекта capybara возьми свойство name».

Важный нюанс: const защищает переменную, не содержимое. const capybara = {...} значит, что capybara нельзя заменить на другой объект. Но свойства внутри менять можно. Коробка приклеена к полке, но вещи внутри перекладываются.

const capybara = {
  name: "Капи",
  role: "Пловец",
  isHungry: true,
  friends: ["Бара", "Макс"]
};

console.log(capybara.name);        // Капи
console.log(capybara.friends[0]); // Бара

capybara.isHungry = false;        // меняем свойство
const capybara = { ... }
Фигурные скобки создают объект. Внутри — пары «ключ: значение». const защищает переменную, не содержимое объекта.
name: "Капи", role: "Пловец"
Свойства объекта. Ключ (имя) слева от двоеточия, значение — справа. Через запятую.
friends: ["Бара", "Макс"]
Значением свойства может быть массив. Объект внутри объекта — тоже можно. Вложенность.
capybara.name
Точка — доступ к свойству. Читается: «у capybara возьми name». Вернёт «Капи».
capybara.friends[0]
Сначала берём свойство friends (массив), потом первый элемент [0]. Вернёт «Бара».
capybara.isHungry = false
const защищает саму переменную, не содержимое. Свойства менять можно.
⚠️ const и объекты
const защищает коробку, не содержимое.
const capybara = {...}
→ нельзя: capybara = другойОбъект
→ можно: capybara.name = "Новое имя"
Коробка приклеена к полке (const). Вещи внутри можно перекладывать.
🦫

Капи

Пловец
● Голодна
Задание: семья капибар
вывод
...
6

Условия

if / else — программа проверяет данные и решает, что делать.

Программа принимает решения через if/else. Проверяет условие — если true, выполняет один код. Если false — другой.

=== — строгое сравнение. Всегда используй три знака равно. Двойное == сравнивает нестрого: "5" == 5 даёт true, что обычно не то, что нужно.

&& — логическое «И». Оба условия должны быть true. || — логическое «ИЛИ». Достаточно, чтобы хотя бы одно было true.

let mandarins = 0;

if (mandarins === 0) {
  console.log("Спит");
} else if (mandarins > 0 && mandarins < 4) {
  console.log("Кушает");
} else {
  console.log("Танцует");
}
let mandarins = 0
Переменная с количеством мандаринок. Начинаем с нуля.
if (mandarins === 0)
=== — строгое сравнение. Если mandarins равно нулю — выполняется код в фигурных скобках.
console.log("Спит")
Выполнится только если условие выше — true. Мандаринок ноль — капибара спит.
else if (mandarins > 0 && mandarins < 4)
&& — логическое «И». Оба условия должны быть true одновременно: больше нуля И меньше четырёх.
console.log("Кушает")
Если мандаринок от 1 до 3 — капибара кушает.
else { }
Всё, что не попало ни в один if. Если мандаринок 4 и больше — танцует.
console.log("Танцует")
Финальная ветка. 4+ мандаринок — капибара танцует.
=== а не ==

Всегда ===. Оператор == сравнивает нестрого: "5" == 5 даёт true. Если ИИ сгенерировал == — исправляй на ===.

😴
Спит

Мандаринок: 0

Задание: найди логическую ошибку
вывод
...
7

Методы массивов

.filter(), .map(), .forEach() — три метода вместо циклов.

Когда в массиве 100 элементов, обрабатывать каждый вручную невозможно. Нужен способ пройтись по всему списку за одну команду. Для этого есть три метода — каждый делает своё.

.filter() — фильтр. Проходит по массиву и проверяет каждый элемент. Подходит — оставляет. Не подходит — выбрасывает. Результат — новый массив, только с нужными элементами.

.map() — преобразователь. Берёт каждый элемент, что-то с ним делает и кладёт результат в новый массив. Как конвейер: на вход — объекты, на выход — только имена.

.forEach() — просто проходит по списку и выполняет действие с каждым элементом. Ничего не возвращает. Подходит, когда нужно вывести или записать данные.

const capybaras = [
  { name: "Капи", weight: 45 },
  { name: "Бара", weight: 60 },
  { name: "Дон",  weight: 55 }
];

// filter — оставить только подходящих
const heavy = capybaras.filter(c => c.weight >= 50);

// map — преобразовать каждый элемент
const names = capybaras.map(c => c.name);

// forEach — пройти по списку
capybaras.forEach(c => {
  console.log(`${c.name}: ${c.weight} кг`);
});
const capybaras = [...]
Массив объектов. Каждый элемент — объект с полями name и weight. Частый паттерн в реальных данных.
.filter(c => c.weight >= 50)
Проходит по массиву. Если функция вернула true — элемент попадёт в новый массив. Бара (60) и Дон (55) пройдут фильтр.
.map(c => c.name)
Создаёт новый массив той же длины, но с преобразованными элементами. Из объектов — только имена: ["Капи", "Бара", "Дон"].
.forEach(c => { ... })
Просто выполняет код для каждого элемента. Ничего не возвращает. Для побочных эффектов: вывод, запись в DOM.
console.log(`${c.name}: ${c.weight} кг`)
Шаблонная строка внутри forEach. Для каждой капибары выведет имя и вес.
Задание: фильтрация
вывод
...
8

DOM и события

JS находит элементы HTML, меняет текст и реагирует на клики.

DOM — это HTML-страница глазами JavaScript. Каждый элемент (кнопка, заголовок, абзац) — это объект, к которому JS может обращаться.

document.getElementById('id') — находит элемент по id. .textContent — меняет текст. .addEventListener — вешает реакцию на действие (клик, ввод текста, наведение мыши).

Это основа любого интерактива на странице. Когда ИИ генерирует код для кнопок, форм, всплывающих окон — это всё DOM + события.

как читать эти длинные конструкции

Точка — это «у кого возьми что». Читай слева направо:

document.getElementById('id')

У document (страница) возьми метод getElementById (найди элемент по id) и передай в ('id') (скобки) конкретный id.

btn.addEventListener('click', () => { })

У btn (кнопка) вызови addEventListener (добавь слушателя). Первый аргумент — 'click' (какое событие). Второй — () => { } (что делать).

display.textContent = "Новый текст"

У display (элемент) возьми свойство textContent (текст внутри) и присвой = новое значение.

Правило: точка = «у кого». Скобки () = «выполни с этими данными». = «присвой». => = «делает».

const btn = document.getElementById('my-button');
const display = document.getElementById('result');

display.textContent = "Новый текст";

btn.addEventListener('click', () => {
  display.textContent = "Кнопка нажата";
});
document.getElementById('my-button')
Ищет элемент по id. Не нашёл — вернёт null. Результат сохраняем в переменную для дальнейшей работы.
document.getElementById('result')
Ещё один элемент. В него будем записывать текст. Найти элемент — первый шаг любого взаимодействия.
display.textContent = "Новый текст"
Меняет текст внутри элемента. Пользователь увидит «Новый текст» вместо старого.
btn.addEventListener('click', () => { })
При клике на кнопку выполни функцию. Другие события: input, mouseover, keydown.
display.textContent = "Кнопка нажата"
Внутри обработчика клика. Каждый раз при нажатии текст обновляется.
Задание: изменить текст
вывод
...
итог

Что ты теперь знаешь

Как JS подключается к HTML
Переменные: const (не меняется) и let (меняется)
Типы данных: строки, числа, boolean
Шаблонные строки через ` и ${}
Функции и стрелочная запись =>
Массивы — пронумерованные списки
Объекты — данные с именами (ключ: значение)
Условия: if/else, ===, &&, ||
Методы массивов: filter, map, forEach
DOM: находить элементы и реагировать на события

Ты не пишешь код — ты читаешь его. Теперь ты знаешь, куда смотреть и что просить исправить.