MakeFirstStep· Frontend + ИИ

Урок 2 · JavaScript

Переменные, типы данных, приведение типов

Любая программа что-то помнит: цену товара, имя пользователя, число в корзине. Для этого нужны переменные, а у каждого значения есть тип — и от него зависит, как JavaScript с ним обращается. Сегодня вы научитесь хранить данные, узнавать их тип и не попадаться на классические ловушки вроде "5" + 3. В конце урока — первая работа с ИИ: как составить промпт и как поймать ИИ на ошибке.

  • Объявлять переменные через let и const и объяснить, почему var не используем
  • Давать переменным правильные имена
  • Различать типы string, number, boolean, null, undefined и узнавать их через typeof
  • Собирать строки шаблонными литералами и считать арифметикой
  • Превращать значения из одного типа в другой явно — и предсказывать неявное приведение
  • Писать промпт по формуле «контекст → задача → ограничения → формат» и проверять ответ ИИ
Как работать с этой страницей

Весь код на тёмном фоне с кнопкой ▶ Запустить — живой. Его можно менять и сразу видеть результат в консоли под ним. Сломали — нажмите ↺ Сброс. Это урок про предсказания: перед запуском кода спросите себя «что выведется?», запишите ответ — и только потом нажимайте кнопку. Подсказки к задачам спрятаны: сначала попробуйте сами. Из урока 1 вам нужны только console.log, тег script и DevTools — всё остальное объясняем здесь.

01 Переменные: let, const и почему не var

Переменная — это именованное место в памяти, куда программа кладёт значение, чтобы потом достать его по имени. Вместо того чтобы писать число 25 в десяти местах, вы записываете его один раз и дальше пользуетесь именем.

Можно редактировать · Ctrl + Enter
let price = 25;
console.log(price);        // → 25

price = 30;                // новое значение
console.log(price);        // → 30
console.log(price * 2);    // → 60
Аналогия из жизни

Камера хранения на автовокзале в Душанбе. У каждой ячейки есть номер — это имя переменной. Внутри лежит вещь — это значение. Вы можете открыть ячейку и положить туда другую вещь (let), а можете запереть её так, что менять содержимое нельзя (const).

Как объявить переменную

let price = 25;
«Создай ячейку с именем price и положи в неё 25»
let
Переменная, значение которой можно менять: баланс, счётчик, имя пользователя.
const
Переменная, которую нельзя переприсвоить: курс валюты, название академии, адрес сайта. Это вариант по умолчанию.
var
Старый способ из эпохи до 2015 года. Работает, но ведёт себя неожиданно. В новом коде не используем.
Правило курса

Начинайте с const. Если позже выяснится, что значение должно меняться, — замените на let. Так по коду сразу видно, что может измениться, а что нет.

Можно редактировать · Ctrl + Enter
const academy = "MakeFirstStep";   // не меняется
let students = 12;            // будет меняться

students = 13;                // пришёл новый студент
console.log(academy, students);   // → MakeFirstStep 13

Что будет, если изменить const

JavaScript остановит программу и покажет ошибку. Это не поломка, а защита: вы сами сказали, что значение не должно меняться.

Этот код выдаст ошибку · Ctrl + Enter
const rate = 10.95;
console.log("Курс:", rate);

rate = 11;   // ✖ TypeError: Assignment to constant variable.
console.log("Новый курс:", rate);

Обратите внимание: строка с "Новый курс" не выполнилась. После ошибки программа останавливается. Умение читать текст ошибки — один из главных навыков программиста: TypeError — «тип ошибки», после двоеточия — понятное описание.

Объявить и присвоить — разные вещи

  • Объявление — слово let или const и имя. Делается один раз.
  • Присваивание — знак =. Можно делать много раз (для let).
  • У const значение нужно задать сразу при объявлении: const x; — ошибка.
  • У let можно объявить без значения: let result; — внутри будет undefined («не определено»). Про него поговорим в разделе о типах.
Можно редактировать · Ctrl + Enter
let result;                 // объявили, значения пока нет
console.log(result);        // → undefined

result = 100;               // присвоили
console.log(result);        // → 100

Почему не var

У var три неприятные особенности. Вы будете встречать его в старых учебниках и в ответах ИИ, поэтому важно понимать, в чём проблема.

1. «Протекает» из фигурных скобок. Код в { } — это блок. Переменная let остаётся внутри блока, а var выходит наружу:

Можно редактировать · Ctrl + Enter
{
  var oldWay = "var видно снаружи";
  let newWay = "let живёт только внутри";
  console.log(newWay);        // → let живёт только внутри
}

console.log(oldWay);          // → var видно снаружи
Этот код выдаст ошибку · Ctrl + Enter
{
  let newWay = "let живёт только внутри";
}

console.log(newWay);   // ✖ ReferenceError: newWay is not defined

2. Позволяет объявить то же имя дважды — и вы можете случайно перезаписать чужую переменную, даже не заметив:

Можно редактировать · Ctrl + Enter
var city = "Душанбе";
var city = "Худжанд";      // JavaScript молчит, хотя имя уже занято
console.log(city);         // → Худжанд
Этот код выдаст ошибку · Ctrl + Enter
let city = "Душанбе";
let city = "Худжанд";      // ✖ SyntaxError: Identifier 'city' has already been declared
console.log(city);

3. «Поднимается»: var можно использовать до строки с объявлением — получите undefined вместо понятной ошибки. С let и const JavaScript честно скажет, что вы поторопились.

Можно редактировать · Ctrl + Enter
console.log(a);   // → undefined (странно, но без ошибки)
var a = 5;
console.log(a);   // → 5
Этот код выдаст ошибку · Ctrl + Enter
console.log(b);   // ✖ ReferenceError: Cannot access 'b' before initialization
let b = 5;
Вывод

Ошибка, которую JavaScript показывает сразу, — это хорошо: её легко найти. var прячет ошибки, let и const их показывают. Поэтому: только const и let.

Как называть переменные

ПравилоПример
Буквы, цифры, _ и $; нельзя начинать с цифрыprice1 — можно, 1price — ошибка
Без пробелов и дефисовtotalPrice, но не total price и не total-price
Регистр важенprice и Price — две разные переменные
Нельзя использовать зарезервированные словаlet, const, class, return…
Стиль camelCase: первое слово с маленькой, дальше каждое с большойstudentName, isLoggedIn, priceWithDiscount
Неизменные «настройки» пишут ЗАГЛАВНЫМИ через подчёркиваниеconst USD_RATE = 10.95;
Имя объясняет, что внутри. Латиница, по-английскиage, а не a и не vozrast
Плохо
JavaScript
let x = 25;
let a1 = "Мадина";
let data = 3;
let sum_of_the_all = 100;
Хорошо
JavaScript
let samsaPrice = 25;
let studentName = "Мадина";
let seatsCount = 3;
let totalSum = 100;
Частая ошибка

Опечатка в имени. JavaScript не угадывает, что вы имели в виду: studentName и studentname — разные имена, и вторая окажется is not defined. Читайте текст ошибки внимательно — в нём всегда названо проблемное имя.

Читать подробнее: learn.javascript.ru — Переменные · MDN — Грамматика и типы

Практика: закрепляем

Первые две задачи — только переменные и вывод в консоль.

ЗАДАЧА 1.1

Погода в Душанбе

лёгкая

Объявите const city со значением "Душанбе" и let temperature со значением 24. Затем «наступил вечер» — запишите в temperature новое значение 17. Выведите одной командой console.log город и температуру (через запятую — они выведутся через пробел).

Можно редактировать · Ctrl + Enter
// объявите city и temperature


// измените temperature на 17


// выведите оба значения
Ожидаемый результат
Душанбе 17
Подсказка 1

Строка пишется в кавычках, число — без. Меняем только то, что объявлено через let.

Подсказка 2

Новое значение присваивается без слова let: temperature = 17; — иначе получите ошибку «уже объявлено».

ЗАДАЧА 1.2

Найди баг: пополнение баланса

средняя

Код падает с ошибкой. Прочитайте её в консоли, найдите причину и исправьте одно слово так, чтобы баланс пополнился и вывелось Баланс: 150.

Можно редактировать · Ctrl + Enter
const balance = 100;
balance = balance + 50;   // пополнили на 50 сомони
console.log("Баланс:", balance);
Ожидаемый результат
Баланс: 150
Подсказка 1

Ошибка называется TypeError: Assignment to constant variable. Какое слово в первой строке запрещает менять значение?

Подсказка 2

Замените const на let — переменная, которая меняется, должна быть объявлена через let.

02 Типы данных и typeof

Значения бывают разных типов. Число 25 и текст "25" выглядят похоже, но для JavaScript это совершенно разные вещи: числа можно умножать, а текст — склеивать и показывать. Тип определяет, что со значением можно делать.

Аналогия из жизни

На базаре есть мясной ряд, фруктовый ряд и ряд с посудой. Нон нельзя взвесить на весах для чая и нельзя налить в пиалу. У каждого товара свой «ряд» — свой тип, и от него зависит, что с ним делают.

Пять основных типов

ТипЧто этоПримеры
stringТекст — всегда в кавычках"Салом", 'MakeFirstStep', "25"
numberЧисло — целое или дробное, одного типа25, 3.14, -7
booleanЛогическое «да/нет»: только два значенияtrue, false
null«Пусто» — намеренно записанное отсутствие значенияnull
undefined«Не задано» — значение ещё не присвоеноundefined

Узнать тип значения помогает оператор typeof. Он возвращает строку с названием типа:

Можно редактировать · Ctrl + Enter
console.log(typeof "Салом");     // → string
console.log(typeof 25);          // → number
console.log(typeof 3.14);        // → number  (дробные — тоже number)
console.log(typeof true);        // → boolean
console.log(typeof undefined);   // → undefined

typeof работает и с переменными — он смотрит на значение внутри:

Можно редактировать · Ctrl + Enter
const dish = "курутоб";
const price = 35;
const isSpicy = false;

console.log(dish, typeof dish);       // → курутоб string
console.log(price, typeof price);     // → 35 number
console.log(isSpicy, typeof isSpicy); // → false boolean
Кавычки меняют тип

25 — число, а "25" — строка из двух символов. Если число пришло в кавычках, считать с ним как с числом пока нельзя (про это — в разделах 5 и 6).

Можно редактировать · Ctrl + Enter
console.log(typeof 25);     // → number
console.log(typeof "25");   // → string
console.log(typeof true);   // → boolean
console.log(typeof "true"); // → string — это просто текст из четырёх букв

null и undefined: в чём разница

Аналогия из жизни

Вы пришли в камеру хранения. undefined — ячейка есть, но в неё ещё ничего не положили («не задано»). null — в ячейке лежит записка «здесь намеренно пусто» («значение задано: ничего»).

Можно редактировать · Ctrl + Enter
let phone;                 // объявили, но не присвоили
console.log(phone);        // → undefined

let nickname = null;       // мы сами решили: ника нет
console.log(nickname);     // → null

Обычно undefined появляется «сам» (JavaScript говорит: «тут пусто, потому что вы ничего не положили»), а null программист записывает осознанно: «сейчас значения нет».

Странность typeof null

typeof null возвращает "object", хотя null — отдельный тип. Это известная ошибка, которая появилась в JavaScript в 1995 году и осталась навсегда: исправление сломало бы миллионы старых сайтов. Запомните как факт и не удивляйтесь — ИИ в ответах нередко путает именно это место.

Можно редактировать · Ctrl + Enter
console.log(typeof null);       // → object  (!)
console.log(typeof undefined);  // → undefined
console.log(null === undefined);// → false — «строго равно»: это разные значения (подробнее в разделе 6)

Тип у переменной не закреплён

В JavaScript переменная может хранить значение любого типа и менять его. Это называют динамической типизацией. Удобно, но требует внимания: переменная, в которой было число, вдруг оказывается строкой — и посчитать уже не получится.

Можно редактировать · Ctrl + Enter
let value = 100;
console.log(typeof value);   // → number

value = "сто";
console.log(typeof value);   // → string

value = true;
console.log(typeof value);   // → boolean

Ещё два типа — только знакомство

  • bigint — очень большие целые числа, пишутся с буквой n на конце: 12345678901234567890n. Обычный number точен лишь до 9 007 199 254 740 991. Вам это понадобится редко.
  • symbol — уникальный «идентификатор», создаётся командой Symbol("id"). В этом курсе не потребуется.
Можно редактировать · Ctrl + Enter
console.log(typeof 123n);             // → bigint
console.log(typeof Symbol("id"));     // → symbol

Есть ещё «составной» тип object — для списков и объектов. Его мы разберём на уроках 6 и 7, а пока в нашем списке всего пять основных примитивных типов.

Читать подробнее: learn.javascript.ru — Типы данных · MDN — typeof

Практика: закрепляем

Узнаем типы значений и проверяем свои прогнозы.

ЗАДАЧА 2.1

Паспорт товара

лёгкая

Ниже пять переменных. Выведите typeof каждой из них — по одному значению на строке, в том же порядке, как они объявлены.

Можно редактировать · Ctrl + Enter
const price = 25;
const dish = "самбуса";
const isHot = true;
let discount;
const comment = null;

// выведите typeof каждой переменной
Ожидаемый результат
number
string
boolean
undefined
object
Подсказка 1

Пять отдельных команд: console.log(typeof price); и так далее.

Подсказка 2

Последняя строка кажется ошибкой — но это та самая странность typeof null. Так и должно быть.

ЗАДАЧА 2.2

Предскажи типы

средняя

Запишите в массив prediction тип каждого из девяти значений — строкой, например "number". Код сам сверит прогноз с настоящими результатами typeof: увидите «Верно!» — вы знаете типы.

Можно редактировать · Ctrl + Enter
// Впишите прогноз: тип каждого значения по порядку (каждое значение — текстом, как его покажет консоль)
const prediction = ["", "", "", "", "", "", "", "", ""];
const actual = [
  typeof 42,
  typeof "42",
  typeof 4.2,
  typeof NaN,
  typeof null,
  typeof undefined,
  typeof (5 > 3),
  typeof 10n,
  typeof Symbol("id"),
].map(String);
console.log(actual.join("|") === prediction.join("|") ? "Верно!" : "Не угадали, подумайте ещё");
Ожидаемый результат
Верно!
Подсказка 1

NaN означает «не число», но по типу это всё равно number — так устроен язык. Подробнее в разделе 4.

Подсказка 2

Сравнение 5 > 3 даёт true — логическое значение. Что у него за тип?

03 Строки и шаблонные литералы

Строка — это текст. Её пишут в кавычках, и кавычки бывают трёх видов:

Можно редактировать · Ctrl + Enter
const a = "двойные кавычки";
const b = 'одинарные кавычки';
const c = `обратные кавычки — шаблонная строка`;

console.log(a);
console.log(b);
console.log(c);

Двойные и одинарные — одно и то же, выберите один стиль и держитесь его. Если внутри текста нужны такие же кавычки, их «экранируют» обратной косой чертой:

Можно редактировать · Ctrl + Enter
console.log("Он сказал: \"Салом!\"");     // → Он сказал: "Салом!"
console.log('Сумма: 5 сомони\nИтого: 10');  // \n — перенос строки

Склейка строк через +

Знак + между строками их склеивает. Это называется конкатенация:

Можно редактировать · Ctrl + Enter
const name = "Мадина";
console.log("Салом, " + name + "!");   // → Салом, Мадина!

Работает, но с несколькими значениями быстро превращается в кашу из кавычек и плюсов — и легко забыть пробел.

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

Строка в обратных кавычках `…` позволяет вставлять значения прямо в текст через ${ }. Внутри скобок можно писать любые выражения.

Можно редактировать · Ctrl + Enter
const name = "Мадина";
const age = 19;
const price = 25;

console.log(`Салом, ${name}!`);                     // → Салом, Мадина!
console.log(`${name}, вам ${age} лет`);              // → Мадина, вам 19 лет
console.log(`Три самбусы стоят ${price * 3} сомони`);// → Три самбусы стоят 75 сомони
console.log(`Через год вам будет ${age + 1}`);       // → Через год вам будет 20
Аналогия из жизни

Шаблонная строка — как бланк поздравительного письма с пропусками: «Дорогой(ая) ______, поздравляем с ______!». Бланк один, а пропуски вы заполняете для каждого получателя. В JavaScript пропуски — это ${ }.

Ещё одно удобство: шаблонная строка может занимать несколько строк — переносы сохранятся как есть.

Можно редактировать · Ctrl + Enter
const student = "Фарход";
const grade = 5;

console.log(`Ведомость
Студент: ${student}
Оценка: ${grade}`);

Строка — это ещё и набор команд

У каждой строки есть свойства и команды, которые записываются через точку. Сейчас нам хватит нескольких — как они устроены внутри, узнаем на уроках про функции и объекты.

Можно редактировать · Ctrl + Enter
const city = "  Душанбе  ";

console.log(city.length);              // → 11 — количество символов (с пробелами!)
console.log(city.trim());              // → Душанбе — убрали пробелы по краям
console.log(city.trim().toUpperCase()); // → ДУШАНБЕ
console.log(city.trim().toLowerCase()); // → душанбе
console.log("Салом"[0]);               // → С — первый символ (счёт идёт с нуля)
console.log("Салом"[4]);               // → м — пятый символ
  • .length — длина строки (без скобок: это свойство);
  • .toUpperCase() / .toLowerCase() — заглавные / строчные;
  • .trim() — убирает пробелы с начала и конца;
  • [0], [1] … — символ по номеру; нумерация начинается с нуля.
Частая ошибка

Забыть обратные кавычки: "Привет, ${name}" в обычных кавычках выведет текст дословно — вместе с ${name}. Подстановка работает только в `…`.

Можно редактировать · Ctrl + Enter
const name = "Далер";
console.log("Привет, ${name}");   // → Привет, ${name}  (не сработало!)
console.log(`Привет, ${name}`);   // → Привет, Далер

Читать подробнее: learn.javascript.ru — Строки · MDN — Шаблонные литералы

Практика: закрепляем

Собираем строки из переменных — только шаблонными литералами, без +.

ЗАДАЧА 3.1

Визитка студента

лёгкая

Используя переменные и шаблонную строку, выведите визитку. Данные в переменных менять нельзя: если поменять имя в первой строке, визитка должна измениться.

Можно редактировать · Ctrl + Enter
const name = "Мадина";
const age = 19;
const city = "Душанбе";

// выведите: Меня зовут Мадина, мне 19 лет, живу в Душанбе
Ожидаемый результат
Меня зовут Мадина, мне 19 лет, живу в Душанбе
Подсказка 1

Строку нужно открыть обратной кавычкой ` (клавиша слева от единицы) и закрыть ею же.

Подсказка 2

Каждое значение вставляется своим ${ }: `Меня зовут ${name}, мне ${age} лет, ...`

ЗАДАЧА 3.2

Чек из чайханы

средняя

Выведите одной командой console.log трёхстрочный чек. Итоговая сумма должна считаться в самой строке — выражением внутри ${ }.

Можно редактировать · Ctrl + Enter
const orderNumber = 15;
const dish = "Самбуса";
const count = 3;
const price = 5;

// чек из трёх строк — в одном console.log
Ожидаемый результат
Чек №15
Самбуса x 3
Итого: 15 сомони
Подсказка 1

Шаблонная строка в обратных кавычках может занимать несколько строк — каждый перенос в коде станет переносом в выводе.

Подсказка 2

Третья строка: Итого: ${count * price} сомони. Первая: Чек №${orderNumber}.

04 Числа и операторы

В JavaScript все числа — одного типа number: и целые (25), и дробные (3.14, дробная часть через точку). Для вычислений есть операторы — знаки действий.

ОператорЧто делаетПримерРезультат
+сложение7 + 310
-вычитание7 - 34
*умножение7 * 321
/деление7 / 23.5
%остаток от деления17 % 52
**возведение в степень2 ** 101024
Можно редактировать · Ctrl + Enter
console.log(7 + 3);     // → 10
console.log(7 / 2);     // → 3.5 — деление не округляет
console.log(17 % 5);    // → 2
console.log(2 ** 10);   // → 1024
console.log(2 + 3 * 4); // → 14 — умножение выполняется раньше сложения
console.log((2 + 3) * 4); // → 20 — скобки меняют порядок
Аналогия из жизни

Оператор % — «остаток» — проще всего понять на манты. 17 манты разложили по 5 штук на тарелку: получилось 3 полные тарелки (это Math.floor(17 / 5)), а 2 манты остались — это и есть 17 % 5. Остаток нужен, чтобы узнать, чётное ли число (n % 2 равно 0), или чтобы «зациклить» счёт — например, дни недели.

Можно редактировать · Ctrl + Enter
const manti = 17;
const plates = 5;

console.log(`Полных тарелок: ${Math.floor(manti / plates)}`);  // → 3
console.log(`Осталось манты: ${manti % plates}`);             // → 2
console.log(10 % 2);   // → 0 — чётное
console.log(7 % 2);    // → 1 — нечётное

Округление: Math.round, floor, ceil

Деление часто даёт дробь. Для округления есть три команды, которые начинаются с Math.:

Можно редактировать · Ctrl + Enter
console.log(Math.round(2.5));  // → 3 — до ближайшего целого
console.log(Math.round(2.4));  // → 2
console.log(Math.floor(2.9));  // → 2 — всегда вниз
console.log(Math.ceil(2.1));   // → 3 — всегда вверх

Сокращённая запись: +=, ++ и компания

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

Можно редактировать · Ctrl + Enter
let balance = 100;

balance = balance + 20;   // длинная запись
balance += 20;            // то же самое, коротко
console.log(balance);     // → 140

balance -= 40;            // balance = balance - 40
balance *= 2;             // balance = balance * 2
console.log(balance);     // → 200

let visitors = 0;
visitors++;               // увеличить на 1
visitors++;
console.log(visitors);    // → 2
visitors--;               // уменьшить на 1
console.log(visitors);    // → 1

Знаки ++ и -- можно писать перед переменной и после. Если вы просто увеличиваете число отдельной строкой, разницы нет. Но если значение ещё и используется в этой же строке — разница есть:

Можно редактировать · Ctrl + Enter
let a = 5;
console.log(a++);   // → 5  — сначала отдали старое значение, потом увеличили
console.log(a);     // → 6

let b = 5;
console.log(++b);   // → 6  — сначала увеличили, потом отдали
console.log(b);     // → 6
Совет

Пока вы учитесь, используйте ++ и -- только отдельной строкой — visitors++;. Так не придётся гадать, какое значение получится.

Сравнения дают boolean

Знаки >, <, >=, <=, === (равно) и !== (не равно) сравнивают значения и возвращают true или false. Условия if, которые на этом строятся, мы будем изучать на уроке 3.

Можно редактировать · Ctrl + Enter
console.log(5 > 3);        // → true
console.log(5 < 3);        // → false
console.log(10 >= 10);     // → true
console.log(7 === 7);       // → true
console.log(7 !== 7);       // → false

Infinity и NaN

В математике на ноль делить нельзя. JavaScript не падает, а возвращает особое значение:

Можно редактировать · Ctrl + Enter
console.log(1 / 0);     // → Infinity — «бесконечность»
console.log(-1 / 0);    // → -Infinity
console.log(0 / 0);     // → NaN — «не число» (Not a Number)

NaN появляется, когда арифметика не получилась: например, умножили текст на число. Запомните три свойства NaN:

  • по типу это всё равно number: typeof NaN → "number";
  • оно «заразное»: любое действие с NaN тоже даёт NaN;
  • NaN не равно даже самому себе. Проверять надо командой Number.isNaN(x).
Можно редактировать · Ctrl + Enter
console.log("abc" * 2);              // → NaN
console.log(NaN + 5);                // → NaN — заразилось
console.log(NaN === NaN);            // → false (!)
console.log(Number.isNaN(NaN));      // → true
console.log(Number.isNaN("abc"));    // → false — это строка, не NaN
Дробные числа и деньги

Компьютер хранит дроби в двоичном виде, и некоторые десятичные дроби записываются неточно. Это не баг JavaScript — так работают почти все языки.

Можно редактировать · Ctrl + Enter
console.log(0.1 + 0.2);            // → 0.30000000000000004
console.log(0.1 + 0.2 === 0.3);    // → false

Что делать с деньгами: считать в наименьших единицах — в дирамах (1 сомони = 100 дирамов), то есть в целых числах, и делить на 100 только при показе. А красивый вывод с двумя знаками даёт .toFixed(2) — но помните: он возвращает строку, а не число.

Можно редактировать · Ctrl + Enter
const total = 0.1 + 0.2;
console.log(total.toFixed(2));          // → 0.30
console.log(typeof total.toFixed(2));   // → string — это уже текст!

console.log((10 + 20) / 100);           // → 0.3 — считали в дирамах (10 и 20), потом разделили

Читать подробнее: learn.javascript.ru — Базовые операторы · learn.javascript.ru — Числа

Практика: закрепляем

Считаем в консоли — как на калькуляторе, только с переменными.

ЗАДАЧА 4.1

Манты на тарелках

лёгкая

На кухне приготовили 17 манты и раскладывают их по 5 на тарелку. Выведите, сколько тарелок получится полных и сколько манты останется. Используйте Math.floor и %.

Можно редактировать · Ctrl + Enter
const manti = 17;
const perPlate = 5;

// выведите две строки
Ожидаемый результат
Полных тарелок: 3
Осталось: 2
Подсказка 1

Сколько целых раз 5 «помещается» в 17 — это Math.floor(manti / perPlate).

Подсказка 2

Остаток — manti % perPlate. Для вывода удобно console.log("Осталось:", manti % perPlate).

ЗАДАЧА 4.2

Свободные места в аудитории

средняя

В аудитории 20 свободных мест. Сначала пришли 3 студента, потом ещё один, потом двое ушли. Меняйте seats только сокращёнными операторами (-=, --, +=), а не seats = ....

Можно редактировать · Ctrl + Enter
let seats = 20;

// 1) пришли трое — seats -= 3
// 2) пришёл ещё один — seats--
// 3) двое ушли — seats += 2

console.log("Свободных мест:", seats);
Ожидаемый результат
Свободных мест: 18
Подсказка 1

Пришёл человек — свободных мест стало меньше, ушёл — больше.

Подсказка 2

Три строки: seats -= 3; затем seats--; затем seats += 2;. Проверьте в уме: 20 → 17 → 16 → 18.

05 Явное приведение типов

Приведение типов — превращение значения из одного типа в другой. Оно бывает явным (вы сами просите: «сделай из этого число») и неявным (JavaScript делает это сам, не спрашивая — разберём в следующем разделе). Сначала учимся делать это осознанно.

Аналогия из жизни

Обменный пункт. Вы приходите с долларами, а нужны сомони: сумма «по сути» та же, но форма другая. Для каждой пары валют есть своя касса: String() — «сделать текстом», Number() — «сделать числом», Boolean() — «сделать да/нет». Но обмен бывает неудачным: «абракадабру» в число не обменяешь — получите NaN.

В строку: String()

Можно редактировать · Ctrl + Enter
console.log(String(123));         // → "123"
console.log(String(true));        // → "true"
console.log(String(null));        // → "null"
console.log(String(undefined));   // → "undefined"
console.log(typeof String(123));  // → string

В число: Number()

Самое важное преобразование. В реальной работе числа часто приходят как текст: из поля ввода, из ответа сервера. Пробелы по краям Number() убирает, а вот лишний текст внутри — нет.

Можно редактировать · Ctrl + Enter
console.log(Number("42"));        // → 42
console.log(Number("3.14"));      // → 3.14
console.log(Number("  7  "));     // → 7    — пробелы по краям отбрасываются
console.log(Number("12px"));      // → NaN  — внутри есть лишние символы
console.log(Number("abc"));       // → NaN
console.log(Number(""));          // → 0    — пустая строка даёт ноль (!)
console.log(Number(true));        // → 1
console.log(Number(false));       // → 0
console.log(Number(null));        // → 0
console.log(Number(undefined));   // → NaN
ЗначениеNumber(...)
"42", "3.14", " 7 "соответствующее число
"" (пустая строка)0
"12px", "abc"NaN
true / false1 / 0
null0
undefinedNaN

«Достать» число из текста: parseInt и parseFloat

Number() строгий: любой лишний символ — NaN. А parseInt() и parseFloat() читают строку слева направо, пока видят цифры, и останавливаются на первом лишнем символе. parseInt возвращает целое, parseFloat — дробное.

Можно редактировать · Ctrl + Enter
console.log(parseInt("42px"));       // → 42
console.log(parseInt("3.99"));       // → 3     — дробная часть отброшена (не округлена!)
console.log(parseFloat("3.99kg"));   // → 3.99
console.log(parseFloat("2.5 кг"));   // → 2.5
console.log(parseInt("px42"));       // → NaN   — начало не с цифры
console.log(parseInt("abc"));        // → NaN
СтрокаNumberparseIntparseFloat
"42"424242
"3.99"3.9933.99
"12px"NaN1212
"px12"NaNNaNNaN
""0NaNNaN

Совет профессионалов: parseInt(text, 10) — второй аргумент 10 явно говорит «в десятичной системе». В современных браузерах без него тоже работает, но с ним код надёжнее и понятнее.

В логическое значение: Boolean()

Любое значение можно превратить в true или false. Правило простое: «пустые» значения дают false, все остальные — true. «Пустых» (их называют falsy) всего шесть основных:

  • false — сам по себе;
  • 0 (и -0);
  • "" — пустая строка;
  • null;
  • undefined;
  • NaN.
Можно редактировать · Ctrl + Enter
console.log(Boolean(0));            // → false
console.log(Boolean(""));           // → false
console.log(Boolean(null));         // → false
console.log(Boolean(undefined));    // → false
console.log(Boolean(NaN));          // → false

console.log(Boolean(1));            // → true
console.log(Boolean(-5));           // → true  — любое число, кроме нуля
console.log(Boolean("Салом"));      // → true
console.log(Boolean(" "));          // → true  — пробел это уже символ!
console.log(Boolean("0"));          // → true  — строка "0" не пустая
console.log(Boolean("false"));      // → true  — и это тоже просто текст
Ловушки Boolean

"0" и "false" — непустые строки, поэтому true. А пустая строка "" и число 0 — false. Это место, где ошибаются и новички, и ИИ.

Куда приходят строки в реальных проектах

Значения из полей ввода на странице и из окна prompt() всегда приходят строками, даже если пользователь ввёл цифры. Поэтому Number() придётся писать очень часто. В нашей учебной консоли prompt() недоступен, но вот как это выглядит в браузере:

Для обычной страницы, не для консоли урока
const answer = prompt("Сколько вам лет?");   // пользователь ввёл 19
console.log(typeof answer);                   // → string — всегда строка!

const age = Number(answer);
console.log(age + 1);                         // → 20

Читать подробнее: learn.javascript.ru — Преобразование типов · MDN — parseInt · MDN — Falsy

Практика: закрепляем

Превращаем «текстовые» данные в числа и считаем с ними.

ЗАДАЧА 5.1

Заказ из формы

лёгкая

Данные из формы заказа пришли строками. Превратите цену и количество в числа и выведите итоговую сумму. Для проверки выведите ещё и typeof суммы.

Можно редактировать · Ctrl + Enter
const priceText = "45";
const countText = "3";

// посчитайте итог и выведите его и его тип
Ожидаемый результат
Итого: 135
number
Подсказка 1

Оборачивайте каждую строку в Number(...): Number(priceText).

Подсказка 2

Можно записать одной строкой: const total = Number(priceText) * Number(countText);, затем два console.log.

ЗАДАЧА 5.2

Фрукты по весу

средняя

Продавец записал вес как "2.5 кг". Достаньте из строки число (подумайте, Number здесь подойдёт или нет — проверьте и убедитесь) и посчитайте цену при 18 сомони за килограмм.

Можно редактировать · Ctrl + Enter
const weight = "2.5 кг";
const pricePerKg = 18;

// выведите: Цена: 45 сомони
Ожидаемый результат
Цена: 45 сомони
Подсказка 1

Попробуйте console.log(Number(weight)) — получите NaN: внутри есть «кг». Какая команда читает число до первого лишнего символа?

Подсказка 2

Вес дробный, поэтому нужен parseFloat(weight), а не parseInt — иначе получится 2 вместо 2.5.

06 Неявное приведение: главные ловушки

Если в выражении встречаются значения разных типов, JavaScript сам приводит их к общему виду — и не предупреждает. Иногда это удобно, но чаще становится источником странных ошибок. Ваша задача — понимать правила и уметь предсказывать результат.

Правило 1: «+» с текстом — это склейка

Если хотя бы одна сторона + — строка, JavaScript превращает вторую в строку и склеивает.

Можно редактировать · Ctrl + Enter
console.log("5" + 3);        // → 53   — не 8!
console.log(3 + "5");        // → 35
console.log("Итого: " + 100);// → Итого: 100
console.log("5" + true);     // → 5true
console.log("5" + null);     // → 5null
Аналогия из жизни

Знак + работает как клей. Рядом два числа — он складывает. Рядом хоть один текст — клеит: «5» и «3» превращаются в «53», как номера на бирках. Остальные знаки (-, *, /) клеить не умеют — они только считают.

Правило 2: остальные арифметические знаки превращают в числа

Можно редактировать · Ctrl + Enter
console.log("5" - 3);        // → 2
console.log("5" * "2");      // → 10
console.log("10" / "2");     // → 5
console.log("abc" * 2);      // → NaN — превратить в число не получилось

Правило 3: boolean, null и undefined в вычислениях

Можно редактировать · Ctrl + Enter
console.log(true + 1);       // → 2    — true становится 1
console.log(false + 1);      // → 1    — false становится 0
console.log(null + 1);       // → 1    — null становится 0
console.log(undefined + 1);  // → NaN  — undefined становится NaN

Порядок слева направо

Выражение вычисляется по шагам слева направо. Пока слева числа — они складываются, а как только в цепочке появилась строка — дальше идёт склейка:

Можно редактировать · Ctrl + Enter
console.log(1 + 2 + "3");    // → 33   — сначала 1 + 2 = 3, потом "3" + "3"
console.log("1" + 2 + 3);    // → 123  — сначала "1" + 2 = "12", потом "12" + 3
console.log(1 + 2 + 3);      // → 6

Унарный плюс: короткая запись Number()

Плюс перед значением без левой части превращает его в число — так же, как Number(). Это можно увидеть в чужом коде, а вот своём лучше писать явно.

Можно редактировать · Ctrl + Enter
console.log(+"7");           // → 7
console.log(+"");            // → 0
console.log(+"abc");         // → NaN
console.log(typeof +"7");    // → number
console.log("b" + "a" + +"a" + "a");   // → baNaNa  — известная шутка про NaN

Сравнения: == и ===

Есть два способа проверить равенство. Двойное == «нестрогое» — приводит типы и поэтому ведёт себя странно. Тройное === «строгое» — сравнивает без приведения: значения равны, только если и значение, и тип совпадают.

Можно редактировать · Ctrl + Enter
console.log(5 == "5");        // → true   — привело строку к числу
console.log(5 === "5");       // → false  — разные типы
console.log(0 == "");         // → true   (!)
console.log(0 == false);      // → true   (!)
console.log("0" == false);    // → true   (!)
console.log(null == undefined);   // → true
console.log(null === undefined);  // → false
console.log(null == 0);       // → false  — вот такая непоследовательность
Правило курса

Всегда пишите === и !==. Нестрогое == не используем — оно не стоит запоминания всех его странностей.

Сравнение строк — по буквам

Две строки сравниваются посимвольно, как слова в словаре, а не как числа. Поэтому «10» оказывается «меньше» «9»: первая цифра 1 меньше, чем 9.

Можно редактировать · Ctrl + Enter
console.log("10" > "9");     // → false (!)  — строки сравниваются по символам
console.log("10" > 9);       // → true       — одно из значений число, значит сравнивает как числа
console.log(Number("10") > Number("9"));  // → true — надёжный способ
Как защититься

Не надеяться на «авось» неявного приведения. Получили данные снаружи (поле формы, prompt, ответ сервера) — сразу превратите их в нужный тип через Number(), и дальше работайте уже с числами. Явное лучше неявного: его видно в коде, и оно предсказуемо.

Шпаргалка по ловушкам

ВыражениеРезультатПочему
"5" + 3"53"строка рядом с + — склейка
"5" - 32- превращает строку в число
true + 12true → 1
null + 11null → 0
undefined + 1NaNundefined → NaN
1 + 2 + "3""33"слева направо
"10" > "9"falseстроки — по символам
5 === "5"falseстрогое сравнение учитывает тип

Читать подробнее: learn.javascript.ru — Сравнения · learn.javascript.ru — Преобразование типов

Практика: закрепляем

Предсказываем и чиним — главный навык этого раздела.

ЗАДАЧА 6.1

Предскажи результат

лёгкая

Не запуская код, впишите в prediction результат каждого из шести выражений (текстом, например "53"). Затем запустите: «Верно!» значит, вы помните все правила приведения. Если нет — найдите выражение, в котором ошиблись, и назовите правило.

Можно редактировать · Ctrl + Enter
// Впишите прогноз: результат каждого выражения по порядку (каждое значение — текстом, как его покажет консоль)
const prediction = ["", "", "", "", "", ""];
const actual = [
  "5" + 3,
  "5" - 3,
  "5" * "2",
  true + 1,
  null + 1,
  undefined + 1,
].map(String);
console.log(actual.join("|") === prediction.join("|") ? "Верно!" : "Не угадали, подумайте ещё");
Ожидаемый результат
Верно!
Подсказка 1

Первая строка — склейка (есть строка рядом с +). Вторая и третья — арифметика: строки превращаются в числа.

Подсказка 2

В вычислениях true — это 1, null — это 0, а undefined превращается в NaN, и результат тоже NaN.

ЗАДАЧА 6.2

Найди баг: корзина склеилась

средняя

Цена и количество пришли из формы строками, и вместо суммы получилась склейка. Исправьте код так, чтобы выводилось Итого: 100. Строки price и count менять нельзя.

Можно редактировать · Ctrl + Enter
const price = "25";
const count = "4";

const total = price + count;
console.log("Итого:", total);
Ожидаемый результат
Итого: 100
Подсказка 1

Сейчас выводится Итого: 254 — это склейка двух строк. Нужны числа, и нужно умножить, а не сложить.

Подсказка 2

const total = Number(price) * Number(count);

07 ИИ-блок: анатомия промпта и «ловим ИИ на ошибке»

ИИ-помощник отвечает ровно на тот вопрос, который вы ему задали. Расплывчатый вопрос — расплывчатый ответ, который к тому же может содержать ошибку. Поэтому в этом курсе у нас два навыка: правильно спрашивать (промпт) и проверять ответ (запустить и сверить).

Правила работы с ИИ в нашем курсе

1. Сначала 15 минут пробуете сами — и только потом идёте к ИИ. 2. Не вставляете в работу код, который не можете объяснить строчка за строчкой. 3. Всегда просите объяснение, а не только код. 4. Имена переменных, крайние случаи и логику проверяете руками — в консоли. 5. На контрольных (уроки 6 и 18) ИИ выключен полностью.

Анатомия промпта: четыре обязательных части

Хороший промпт — это не длинный текст, а структура. Запомните порядок: контекст → задача → ограничения → формат ответа. Пятый пункт — проверка — мы добавляем, когда нужен ответ, которому нельзя слепо доверять (то есть почти всегда).

ЧастьЧто писатьПример для этого урока
1. КонтекстКто вы, что уже знаете, над чем работаете«Я новичок, второй урок JavaScript. Знаю console.log, let и const»
2. ЗадачаОдно конкретное действие«Объясни, почему "5" + 3 даёт "53", а "5" - 3 даёт 2»
3. ОграниченияЧто нельзя и что обязательно«Без if, циклов и функций. Новый термин объясняй одной фразой»
4. Формат ответаКак оформить результат«Правило в одном предложении, потом 4 примера кода с результатом в комментарии»
5. ПроверкаЧто дополнительно спросить«Назови 2 случая, где я могу ошибиться, но ответ не пиши — я проверю в консоли»
Аналогия из жизни

Заказ такси. «Отвези меня» — водитель не понимает, куда ехать. «Из Сино в аэропорт, багаж большой, без платной дороги, остановитесь у зала вылета» — это контекст, задача, ограничение и формат в одном предложении. Чем точнее заказ, тем меньше шансов приехать не туда. ИИ — тот же водитель: он не читает мысли.

объясни почему в js 5 + 3 иногда 53
Контекст: я новичок, второй урок JavaScript. Знаю только console.log, let, const и типы string/number/boolean. Задача: объясни, почему "5" + 3 даёт "53", а "5" - 3 даёт 2. Ограничения: без if, циклов и функций. Если используешь новый термин — объясни его одной фразой. Формат ответа: сначала правило в одном предложении, потом 4 коротких примера кода, в комментарии у каждого — результат. Проверка: в конце дай 2 выражения, на которых я могу ошибиться. Ответы не пиши — я проверю в консоли сам.

Чем сильный промпт лучше: ИИ не гадает, какой у вас уровень, не использует незнакомые вам конструкции, отвечает в удобной форме и сам даёт вам материал для самопроверки.

Собираем свой шаблон промпта

Каждый раз писать структуру с нуля долго. Сделайте свой шаблон — заготовку, которую вы будете копировать и заполнять. Это ваш первый артефакт курса: он пойдёт в конспект по промптам, а потом — в личную шпаргалку, которую сдают на уроке 21.

  1. Скопируйте заготовку ниже в свой конспект (файл или заметки).
  2. Заполните «постоянные» поля один раз: в «Контексте» напишите свой уровень и стек («чистый JavaScript, без библиотек, новичок»). Это будет одинаково в каждом промпте.
  3. Придумайте свою «любимую» строку в «Проверке»: например, «покажи, что выведет консоль» или «назови 2 крайних случая». Её вы тоже оставите навсегда.
  4. Протестируйте шаблон на задаче из урока: заполните поля и отправьте ИИ. Если ответ вас не устроил — уточните, в какой из четырёх частей не хватило деталей, и поправьте шаблон.
Контекст: [кто я, что уже умею, над чем работаю — например: «новичок, учу чистый JavaScript, знаю let/const и типы»] Задача: [одно конкретное действие — объясни / проверь / дай 5 задач] Ограничения: [что нельзя использовать, что обязательно; «новые термины объясняй одной фразой»] Формат ответа: [как оформить: сначала правило, потом примеры; сколько примеров; без таблиц] Проверка: [что ещё: «назови 2 места, где я могу ошибиться», «покажи, что выведет консоль»]
Хорошие рабочие промпты по этой теме

Из шпаргалки курса: «Вот код: [код]. Объясни построчно, что происходит и почему результат такой. Не переписывай код — только объясни.» И второй: «Дай 5 задач на [тема] уровня новичка, от простой к сложной, без решений.» Сверяйте объяснение с тем, что реально выводит консоль, а задачи — на соответствие теме и отсутствие готовых ответов.

Как читать ответ ИИ: проверяем, а не верим

ИИ пишет уверенно — даже когда ошибается. На теме типов это особенно заметно: неявное приведение и странности вроде typeof null он нередко пересказывает неверно. Поэтому у вас есть простой алгоритм:

  1. Прогнозируйте. Прочитали объяснение ИИ — запишите, какой результат должен получиться.
  2. Запускайте. Скопируйте пример в консоль и посмотрите, что выведется на самом деле.
  3. Сверяйте. Совпало — отлично. Не совпало — ошибся либо ИИ, либо вы. Разберитесь, кто именно: в этом и есть обучение.
  4. Переспрашивайте. Покажите ИИ реальный вывод: «в консоли получилось X, а ты говорил Y — объясни расхождение».
Консоль — главный судья

Спорный вопрос «кто прав: я, ИИ или учебник» решает не мнение, а запуск кода. Если консоль и ИИ расходятся — прав консоль.

Практика: ловим ИИ на ошибке

Ниже — «ответы ИИ» с неверными утверждениями. Сначала предскажите, что выведет код на самом деле, потом запустите — и исправьте.

ЗАДАЧА 7.1

ИИ о сложении строки и числа

средняя
Ответ ИИ

«Выражение "10" + 5 равно 15: JavaScript видит, что одно значение выглядит как число, и сам превращает строку в число, поэтому выполняется сложение.»

Найдите ошибку: что выведет первая строка на самом деле? Затем допишите вторую строку, которая действительно выведет 15. Кавычки у "10" убирать нельзя — приведение нужно сделать явно.

Можно редактировать · Ctrl + Enter
console.log("10" + 5);

// допишите строку, которая выведет 15
Ожидаемый результат
105
15
Подсказка 1

Знак + рядом со строкой склеивает. ИИ перепутал сложение со склейкой — это правило 1 из раздела 6.

Подсказка 2

Превратите строку в число явно: console.log(Number("10") + 5);

ЗАДАЧА 7.2

ИИ о typeof

средняя
Ответ ИИ

«typeof null вернёт "null", typeof NaN — "NaN", а typeof undefined — "undefined". Каждое значение возвращает строку со своим названием.»

В коде ниже стоят «результаты» из ответа ИИ в виде обычных строк. Замените каждую строку-«ответ» на настоящее выражение с typeof и посмотрите, какие из трёх утверждений верны.

Можно редактировать · Ctrl + Enter
console.log("null");        // должно быть typeof null
console.log("NaN");         // должно быть typeof NaN
console.log("undefined");   // должно быть typeof undefined
Ожидаемый результат
object
number
undefined
Подсказка 1

В скобках console.log( ) должно стоять не слово в кавычках, а выражение: typeof null без кавычек.

Подсказка 2

Верным оказалось только третье утверждение. С typeof null — историческая странность, а NaN по типу — число.

ЗАДАЧА 7.3

ИИ о Boolean

сложная
Ответ ИИ

«Все «пустые» на вид значения превращаются в false: 1) Boolean("0") — false, 2) Boolean("") — false, 3) Boolean(" ") — false (пробел — это тоже пусто), 4) Boolean(0) — false.»

Запустите четыре строки и выясните, какие утверждения ИИ неверны. Затем допишите последнюю строку: Ошибки ИИ: и номера неверных утверждений (через запятую в console.log, в порядке возрастания).

Можно редактировать · Ctrl + Enter
console.log(Boolean("0"));
console.log(Boolean(""));
console.log(Boolean(" "));
console.log(Boolean(0));

// допишите: Ошибки ИИ: ...
Ожидаемый результат
true
false
true
false
Ошибки ИИ: 1 3
Подсказка 1

Сравните вывод консоли с утверждениями ИИ: везде, где ИИ написал false, а консоль показала true — это ошибка.

Подсказка 2

Ошиблись пункты 1 и 3: "0" и " " — непустые строки. Строка в итоге: console.log("Ошибки ИИ:", 1, 3);

Читать подробнее: learn.javascript.ru — Преобразование типов · MDN — Falsy

08 Практика на уроке: 15 мини-задач на типы

Это основная часть занятия. Пятнадцать коротких задач — от простых к сложным. В каждой действует один и тот же ритм:

  1. Прочитайте условие и код.
  2. Предскажите результат — запишите в тетрадь.
  3. Запустите и сверьте. Расхождение — повод вспомнить правило из урока.
  4. Объясните соседу по парте, почему получилось именно так — вслух и своими словами.
Если застряли

Сначала перечитайте нужный раздел урока, потом откройте подсказку. Затем — спросите соседа. К ИИ обращайтесь после 15 минут самостоятельных попыток и используйте шаблон промпта, который вы только что собрали.

Практика: мини-задачи

ЗАДАЧА 8.1

Анкета студента

лёгкая

Объявите три переменные (выберите const или let — какие здесь нужны?): name со значением "Фарход", age — число 20, isStudent — логическое true. Выведите одной строкой шаблонным литералом.

Можно редактировать · Ctrl + Enter
// объявите переменные и выведите строку
Ожидаемый результат
Фарход, 20 лет, студент: true
Подсказка 1

Здесь ничего не меняется, поэтому подойдёт const. Логическое значение пишется без кавычек.

Подсказка 2

console.log(`${name}, ${age} лет, студент: ${isStudent}`);

ЗАДАЧА 8.2

Калькулятор

лёгкая

Впишите в prediction результаты пяти выражений и запустите — код сверит прогноз с настоящими значениями.

Можно редактировать · Ctrl + Enter
// Впишите прогноз: результат каждого выражения по порядку (каждое значение — текстом, как его покажет консоль)
const prediction = ["", "", "", "", ""];
const actual = [
  10 / 4,
  10 % 4,
  2 ** 5,
  7 - "2",
  "7" + 2,
].map(String);
console.log(actual.join("|") === prediction.join("|") ? "Верно!" : "Не угадали, подумайте ещё");
Ожидаемый результат
Верно!
Подсказка 1

Деление в JavaScript не округляет. Остаток 10 % 4 — это то, что осталось после двух полных четвёрок.

Подсказка 2

Предпоследняя строка — арифметика (- делает из строки число), последняя — склейка (+ рядом со строкой).

ЗАДАЧА 8.3

Строка или число

лёгкая

Номер билета пришёл строкой. Превратите его в число, сохраните в ticketNum и убедитесь через typeof, что тип изменился.

Можно редактировать · Ctrl + Enter
const ticket = "15";
console.log(typeof ticket);

// превратите ticket в число: const ticketNum = ...

console.log(typeof ticketNum);
Ожидаемый результат
string
number
Подсказка 1

Пока ticketNum не объявлена, программа падает с ReferenceError. Нужна одна строка между двумя console.log.

Подсказка 2

const ticketNum = Number(ticket);

ЗАДАЧА 8.4

Бесконечность и «не число»

лёгкая

Впишите в prediction результаты пяти выражений. Особое внимание — последнему.

Можно редактировать · Ctrl + Enter
// Впишите прогноз: результат каждого выражения по порядку (каждое значение — текстом, как его покажет консоль)
const prediction = ["", "", "", "", ""];
const actual = [
  5 / 0,
  -5 / 0,
  0 / 0,
  "abc" * 3,
  typeof (0 / 0),
].map(String);
console.log(actual.join("|") === prediction.join("|") ? "Верно!" : "Не угадали, подумайте ещё");
Ожидаемый результат
Верно!
Подсказка 1

Деление ненулевого числа на ноль даёт бесконечность со знаком; 0 / 0 — неопределённость.

Подсказка 2

NaN расшифровывается «не число», но имеет тип number.

ЗАДАЧА 8.5

Заглавная буква

средняя

Название города записано маленькими буквами. Сделайте первую букву заглавной и выведите результат, а на второй строке — длину строки. Помните: символ по номеру — city[0], а «всё, кроме первого символа» — это city.slice(1).

Можно редактировать · Ctrl + Enter
const city = "душанбе";

// первая буква — заглавная, остальные — как были
Ожидаемый результат
Душанбе
7
Подсказка 1

Возьмите первый символ, сделайте его заглавным через .toUpperCase() и склейте с остатком строки.

Подсказка 2

console.log(city[0].toUpperCase() + city.slice(1)); и console.log(city.length);

ЗАДАЧА 8.6

Средний балл

средняя

Три оценки пришли строками. Посчитайте средний балл и выведите его с одним знаком после запятой. Помните: .toFixed(1) оставляет один знак.

Можно редактировать · Ctrl + Enter
const g1 = "5";
const g2 = "4";
const g3 = "5";

// выведите: Средний балл: 4.7
Ожидаемый результат
Средний балл: 4.7
Подсказка 1

Если сложить строки через +, получится склейка "545". Сначала превратите каждую оценку в число.

Подсказка 2

const avg = (Number(g1) + Number(g2) + Number(g3)) / 3; и затем avg.toFixed(1) внутри шаблонной строки.

ЗАДАЧА 8.7

Шесть Boolean

средняя

Предскажите, какие из шести значений станут true, а какие false: впишите шесть слов в prediction и запустите.

Можно редактировать · Ctrl + Enter
// Впишите прогноз: true или false для каждого значения (каждое значение — текстом, как его покажет консоль)
const prediction = ["", "", "", "", "", ""];
const actual = [
  Boolean(0),
  Boolean(""),
  Boolean("0"),
  Boolean(null),
  Boolean("false"),
  Boolean(NaN),
].map(String);
console.log(actual.join("|") === prediction.join("|") ? "Верно!" : "Не угадали, подумайте ещё");
Ожидаемый результат
Верно!
Подсказка 1

Вспомните список «пустых» значений: false, 0, "", null, undefined, NaN.

Подсказка 2

Строки "0" и "false" — непустые, значит true.

ЗАДАЧА 8.8

Цепочка операторов

средняя

Выполните пять операций над n, используя только сокращённые операторы: прибавить 5, умножить на 2, вычесть 3, разделить на 3, возвести в квадрат (**=).

Можно редактировать · Ctrl + Enter
let n = 10;

// +5, *2, -3, /3, в квадрат

console.log("n =", n);
Ожидаемый результат
n = 81
Подсказка 1

Проверьте в уме: 10 → 15 → 30 → 27 → 9 → 81.

Подсказка 2

n += 5; n *= 2; n -= 3; n /= 3; n **= 2;

ЗАДАЧА 8.9

До или после

лёгкая

Впишите в prediction пять значений, которые выведет код. Следите за значением a после каждой команды.

Можно редактировать · Ctrl + Enter
// Впишите прогноз: пять значений, которые вернут выражения по порядку (текстом)
const prediction = ["", "", "", "", ""];
let a = 3;
const actual = [a++, a, ++a, a--, a].map(String);
console.log(actual.join("|") === prediction.join("|") ? "Верно!" : "Не угадали, подумайте ещё");
Ожидаемый результат
Верно!
Подсказка 1

a++ сначала отдаёт старое значение, потом увеличивает. ++a — наоборот.

Подсказка 2

Состояние a по шагам: 3 → 4 → 4 → 5 → 5 → 4.

ЗАДАЧА 8.10

Время в пути

сложная

Поездка Душанбе — Хорог занимает 275 минут (условно). Выведите время в формате «часы и минуты». Используйте Math.floor и %.

Можно редактировать · Ctrl + Enter
const minutes = 275;

// выведите: В пути: 4 ч 35 мин
Ожидаемый результат
В пути: 4 ч 35 мин
Подсказка 1

В часе 60 минут. Целые часы — это целая часть деления на 60.

Подсказка 2

Часы: Math.floor(minutes / 60), минуты: minutes % 60.

ЗАДАЧА 8.11

null и undefined

лёгкая

Впишите в prediction шесть значений — так, как их напечатал бы console.log через пробел.

Можно редактировать · Ctrl + Enter
// Впишите прогноз: шесть значений по порядку (текстом)
const prediction = ["", "", "", "", "", ""];
let a;
const b = null;
const actual = [a, b, typeof a, typeof b, a == b, a === b].map(String);
console.log(actual.join("|") === prediction.join("|") ? "Верно!" : "Не угадали, подумайте ещё");
Ожидаемый результат
Верно!
Подсказка 1

typeof b — та самая странность typeof null.

Подсказка 2

null == undefined — true (нестрогое сравнение приводит их друг к другу), а строгое === видит разные типы — false.

ЗАДАЧА 8.12

Склеили или сложили

средняя

Впишите в prediction результаты пяти выражений. Для каждого заранее решите, где было сложение, а где склейка.

Можно редактировать · Ctrl + Enter
// Впишите прогноз: результат каждого выражения по порядку (каждое значение — текстом, как его покажет консоль)
const prediction = ["", "", "", "", ""];
const actual = [
  1 + "2" + 3,
  "3" * "4" + 1,
  10 - "2" + "2",
  "4" + 4 * 2,
  10 / "5" + "1",
].map(String);
console.log(actual.join("|") === prediction.join("|") ? "Верно!" : "Не угадали, подумайте ещё");
Ожидаемый результат
Верно!
Подсказка 1

Идите слева направо, но помните: * и / выполняются раньше + и -.

Подсказка 2

Четвёртая строка: сначала 4 * 2 = 8, потом "4" + 8 — склейка, получится "48".

ЗАДАЧА 8.13

Цифры числа

сложная

Дано число 2587. Без строк и циклов, только арифметикой, выведите его последнюю цифру, число без последней цифры и признак «чётное ли число» (результат сравнения с ===).

Можно редактировать · Ctrl + Enter
const n = 2587;

// выведите три строки
Ожидаемый результат
Последняя цифра: 7
Без неё: 258
Чётное: false
Подсказка 1

Последняя цифра — остаток от деления на 10. Остальное — целая часть деления на 10.

Подсказка 2

n % 10, Math.floor(n / 10), n % 2 === 0.

ЗАДАЧА 8.14

Дирамы без ошибок

сложная

Два пирожка стоят 0.1 и 0.2 сомони. Наивное сложение даёт неточный результат — выведите его первой строкой. Затем посчитайте точно: переведите цены в дирамы (умножьте на 100 и округлите через Math.round), сложите, переведите обратно в сомони.

Можно редактировать · Ctrl + Enter
const a = 0.1;
const b = 0.2;

console.log("Наивно:", a + b);

// посчитайте через дирамы и выведите: Точно: 0.3
Ожидаемый результат
Наивно: 0.30000000000000004
Точно: 0.3
Подсказка 1

Дирамы — целые числа: Math.round(a * 100) это 10, а Math.round(b * 100) это 20.

Подсказка 2

const total = Math.round(a * 100) + Math.round(b * 100); и вывести total / 100.

ЗАДАЧА 8.15

Чек с налогом

сложная

В форме магазина цена и количество — строки. К сумме добавляется налог 15% (коэффициент 1.15). Посчитайте сумму к оплате, округлите до целого и выведите.

Можно редактировать · Ctrl + Enter
const priceText = "200";
const countText = "3";
const TAX = 1.15;

// выведите: К оплате: 690 сомони
Ожидаемый результат
К оплате: 690 сомони
Подсказка 1

Строки в числа через Number, затем умножение на количество и на TAX.

Подсказка 2

const total = Math.round(Number(priceText) * Number(countText) * TAX); — и вывести шаблонной строкой.

09 Домашнее задание

Домашняя работа — 10 задач и конспект по промптам. Результат: файл tasks-02.js и конспект с промптами. Решения пишите в обычном файле — запускайте через консоль браузера (вставляйте код) или в VS Code.

Как оформить tasks-02.js

Для каждой задачи — комментарий с номером и условием, затем код. В задачах на предсказание сначала пишите свой прогноз комментарием, потом код, который проверяет прогноз, а в конце комментарий «совпало» или «не совпало, потому что…».

10 задач

  1. Паспорт данных. Объявите 8 переменных разных типов (string, number, boolean, null, undefined и ещё три на ваш выбор). Для каждой выведите значение и typeof.
  2. Моя визитка. Данные о себе (имя, возраст, город, любимое блюдо) положите в const. Выведите многострочную визитку одним console.log с шаблонной строкой.
  3. Конвертер валют. Курс USD_RATE = 10.95 положите в const. Сумма в долларах пришла строкой "250". Выведите сумму в сомони, округлив до двух знаков через toFixed(2).
  4. Предскажи 8 выражений. Составьте самостоятельно 8 выражений с неявным приведением (+, -, *, true, null, undefined). Запишите прогноз, затем запустите и сверьте.
  5. Часы и минуты. По количеству секунд (например, 10000) выведите время в формате «часы : минуты : секунды». Используйте Math.floor и %.
  6. Починить три фрагмента. Напишите три коротких фрагмента с ошибкой приведения типов (склейка вместо сложения; NaN из-за undefined; нестрогое сравнение), а ниже — исправленную версию каждого.
  7. Falsy-детектор. Выведите Boolean(...) для 12 разных значений (0, "", " ", "0", null, undefined, NaN, -1 и др.). Рядом комментарием — ваш прогноз.
  8. Охота на NaN и Infinity. Найдите три разных способа получить NaN и два — Infinity. Проверьте NaN через Number.isNaN.
  9. Деньги без ошибок. Корзина: три товара с ценами в сомони с копейками (например, 12.40, 7.35, 0.10). Посчитайте итог через дирамы (целыми числами) и выведите в сомони.
  10. Один хороший промпт. Составьте промпт по формуле «контекст → задача → ограничения → формат» на любую задачу из этого урока. Запишите его в конспект (см. ниже).

Работа с ИИ и конспект по промптам

Задание на «ловлю ошибок»

Выберите любые 3 задачи из 10. Для каждой отправьте ИИ промпт по вашему шаблону: «объясни, как это решается, и что выведет консоль». Затем запустите код из ответа и сверьте с вашим результатом. В конспекте запишите для каждой из трёх задач:

  • какой промпт вы отправили (текстом);
  • краткое содержание ответа ИИ (2–3 предложения);
  • где ИИ ошибся — или, если не ошибся, что именно вы проверили, чтобы убедиться;
  • что вы исправили или уточнили вторым промптом.

Если ИИ не ошибся ни разу — это нормально, но тогда нужны доказательства: что именно вы запустили и сверили. Ответ «ИИ был прав, потому что так сказал ИИ» не засчитывается.

Что сдать

  • tasks-02.js — решения 10 задач с комментариями-прогнозами;
  • prompts-02.md — конспект по промптам: ваш шаблон из урока + три разбора «промпт → ответ → ошибка/проверка»;
  • оба файла — в репозиторий на GitHub (ссылку пришлите преподавателю).

Как оценивается (0–10)

БаллыЗа что
0–5Задачи 1–10: по 0,5 балла за каждую — код запускается и выводит то, что требовалось
0–1Аккуратность: имена в camelCase, только const/let, нет var и нестрогого ==, комментарии с прогнозами
0–1Шаблон промпта: есть все четыре части и поле «Проверка»
0–3Три разбора ИИ: по 1 баллу — есть промпт, ответ, проверка запуском и честный вывод «где ошибся / что проверил»
Помните

Код, который вы не можете объяснить строчка за строчкой, считается не вашим. Преподаватель может попросить объяснить любую задачу устно.

✓ Шпаргалка урока

  • Переменная — именованная ячейка со значением. const — по умолчанию, let — если значение меняется, var — не используем (протекает из блока, молчит о повторном объявлении, «поднимается»).
  • Имена: латиница, camelCase, не с цифры, регистр важен; константы-настройки — UPPER_CASE.
  • Типы: string, number, boolean, null, undefined (+ bigint, symbol). typeof возвращает строку. typeof null → "object" — историческая странность; typeof NaN → "number".
  • undefined — «значения ещё нет», null — «значения намеренно нет».
  • Строки: шаблонные литералы `Салом, ${name}`; .length, .trim(), .toUpperCase(), s[0]. Подстановка работает только в обратных кавычках.
  • Операторы: + - * / % **; сокращения +=, -=, ++, --; Math.round/floor/ceil для округления.
  • NaN — «не число», заразен, NaN !== NaN, проверка — Number.isNaN(). Infinity — результат деления на ноль.
  • Деньги считаем в целых дирамах; 0.1 + 0.2 !== 0.3; toFixed() возвращает строку.
  • Явное приведение: String(), Number() ("" → 0, лишний текст → NaN), parseInt/parseFloat читают число из начала строки, Boolean().
  • Falsy: false, 0, "", null, undefined, NaN. Всё остальное — true, включая "0" и "false".
  • Неявное приведение: "5" + 3 → "53" (строка с + — склейка); "5" - 3 → 2; true + 1 → 2; null + 1 → 1; undefined + 1 → NaN; 1 + 2 + "3" → "33".
  • Сравнение: всегда === и !==. Строки сравниваются по символам: "10" > "9" → false.
  • Промпт: контекст → задача → ограничения → формат ответа (+ проверка). Ответ ИИ — гипотеза: прогнозируй, запускай, сверяй, переспрашивай. Консоль — главный судья.