Где живёт 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;
});
👆 кликай на элемент, чтобы узнать что он делает
Замени текст в console.log на «Привет, Капибара!» и нажми Run.
Переменные
Хранят данные: имя, возраст, счёт. Без них программа ничего не запоминает.
Переменная — это коробка с надписью. Внутри лежат данные: число, текст, список. Надпись на коробке — имя переменной. По имени ты обращаешься к данным.
Два ключевых слова: const и let. const — коробка запечатана. Положил данные — больше не заменишь. let — коробка открыта. Данные можно заменить на другие.
Когда что использовать? По умолчанию пиши const. Если значение реально будет меняться (счётчик, состояние) — let.
const name = "Капи"; // имя не изменится
let age = 3; // возраст растёт
age = age + 1;
console.log(name); // Капи
console.log(age); // 4
👆 кликай на элемент, чтобы узнать что он делает
По умолчанию пиши const. Если значение реально меняется — let.
В JS имена переменных и функций пишут слитно: первое слово с маленькой буквы, каждое следующее — с большой. capybaraName, isHungry, getElementById. Это называется camelCase — «горбатый регистр», потому что заглавные буквы торчат как горбы верблюда.
Когда видишь длинное слово типа addEventListener — разбей на части: add + Event + Listener = «добавь слушатель событий». Так читаешь любой код.
Капи // const
Возраст: 3 // let
В коде ниже перепутаны var, const и let. Имя капибары не меняется — какое ключевое слово подойдёт? Количество мандаринок будет расти — какое?
Типы данных
Строка, число, true/false — JS различает типы. От типа зависит, что можно делать с данными.
У каждого значения есть тип. Тип определяет, что с этим значением можно делать.
"Капи" — это строка (string). Текст в кавычках. Можно склеивать строки, искать символы, считать длину.
3 — это число (number). Целые и дробные. Можно складывать, вычитать, сравнивать.
true / false — это boolean. Логический тип. Всего два значения: да или нет. Используется в условиях: если true — делаем одно, если false — другое.
Важно: "3" (в кавычках) — это строка, а не число. Кавычки превращают что угодно в текст. typeof покажет тип любого значения.
const name = "Капи"; // строка
const age = 3; // число
const isHungry = true; // boolean
typeof name // "string"
typeof age // "number"
typeof isHungry // "boolean"
👆 кликай на элемент, чтобы узнать что он делает
"5" + 3 = "53", а не 8. Строка + число = склейка. Число + число = математика.
🧩 Перетащи значения в правильный тип
Шаблонные строки
Способ вставлять переменные прямо в текст без склейки через +.
Когда нужно вставить переменную в текст, есть два способа. Старый: склейка через +. Неудобно — легко потерять пробел или кавычку. Новый: обратные кавычки ` и ${переменная} внутри. Читается как обычное предложение. ИИ генерирует так почти всегда.
Обратные кавычки — это не одинарные и не двойные. На клавиатуре — левый верхний угол, клавиша с тильдой ~ (на русской раскладке там Ё). Только в обратных кавычках работает ${}.
const name = "Капибара";
let score = 100;
// старый способ — склейка через +
console.log("Игрок " + name + " набрал " + score);
// новый — шаблонная строка
console.log(`Игрок ${name} набрал ${score} очков`);
👆 кликай на элемент, чтобы узнать что он делает
Перепиши склейку через + на шаблонную строку с обратными кавычками ` и ${}.
Функции
Набор команд с именем. Один раз написал — вызываешь сколько угодно раз с разными данными.
Представь рецепт. Записал один раз «сварить борщ» — и каждый раз готовишь по нему, не вспоминая шаги заново. Функция работает так же: набор команд под одним именем. Вызвал по имени — команды выполнились.
У функции бывают параметры — пустые слоты для данных. Вызываешь функцию и передаёшь конкретные значения. Функция работает с ними и может вернуть результат через return.
Стрелочная запись: const feed = (food) => { ... } — то же самое, что function feed(food) { ... }, но короче. ИИ часто пишет именно так. => читается как «делает».
function feedCapybara(food, calories) {
console.log(`Капибара съела ${food}`);
return calories;
}
feedCapybara("Траву", 1); // Капибара съела Траву
feedCapybara("Арбуз", 5); // Капибара съела Арбуз
👆 кликай на элемент, чтобы узнать что он делает
ИИ часто пишет const feed = (food) => { ... }. Это то же самое, что function feed(food) { ... }, только короче. => читается как «делает».
Вес: 45 кг
Перепиши обычную функцию на стрелочную запись: const имя = (параметр) => { }.
Массивы
Пронумерованный список значений. Нумерация с нуля.
Массив — это пронумерованный список. Как полка с ячейками: в каждой ячейке лежит что-то, и у каждой есть номер.
Нумерация начинается с нуля, не с единицы. Первый элемент — [0], второй — [1]. Это правило, к нему привыкаешь.
Зачем массивы? Хранить списки: товары в корзине, сообщения в чате, пользователей в таблице. Без массивов пришлось бы создавать отдельную переменную для каждого элемента.
let backpack = ["Мандаринка", "Яблоко"];
backpack.push("Трава"); // добавить в конец
console.log(backpack[0]); // Мандаринка
console.log(backpack.length); // 3
backpack.pop(); // убрать последний
👆 кликай на элемент, чтобы узнать что он делает
Предметов: 1
Добавь в массив "Вкусная трава" через .push(), затем выведи длину массива через .length.
Объекты
Набор свойств с именами. Как карточка персонажа: имя, роль, статус.
Объект — набор свойств с именами. Если массив — это полка с номерами, то объект — это анкета: имя, возраст, роль. У каждого свойства есть ключ (имя) и значение.
Обращаешься через точку: 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 защищает коробку, не содержимое.const capybara = {...}
→ нельзя:
capybara = другойОбъект→ можно:
capybara.name = "Новое имя"
Капи
ПловецВыведи любимую еду Бары. Подсказка: Бара — второй элемент массива (индекс 1), а еда лежит в свойстве favoriteFood.
Условия
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("Танцует");
}
👆 кликай на элемент, чтобы узнать что он делает
Всегда = = =. Оператор = = сравнивает нестрого: "5" = = 5 даёт true. Если ИИ сгенерировал = = — исправляй на = = =.
Мандаринок: 0
Капибара голодна, но еды нет — а код говорит «кушает». Найди логическую ошибку в условии и исправь.
Методы массивов
.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} кг`);
});
👆 кликай на элемент, чтобы узнать что он делает
Замени пустой массив [] на вызов .filter(), который оставит только капибар с весом 50 кг и больше.
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 = "Кнопка нажата";
});
👆 кликай на элемент, чтобы узнать что он делает
Что ты теперь знаешь
const (не меняется) и let (меняется)
` и ${}
=>
if/else, ===, &&, ||
filter, map, forEach
Ты не пишешь код — ты читаешь его. Теперь ты знаешь, куда смотреть и что просить исправить.