Любая программа что-то помнит: цену товара, имя пользователя, число в корзине. Для этого нужны переменные, а у каждого значения есть тип — и от него зависит, как 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).
Как объявить переменную
letprice=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 остановит программу и покажет ошибку. Это не поломка, а защита: вы сами сказали, что значение не должно меняться.
Обратите внимание: строка с "Новый курс" не выполнилась. После ошибки программа останавливается. Умение читать текст ошибки — один из главных навыков программиста: 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 initializationlet 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. Читайте текст ошибки внимательно — в нём всегда названо проблемное имя.
Первые две задачи — только переменные и вывод в консоль.
ЗАДАЧА 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.
Ошибка называется 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(typeof25); // → number
console.log(typeof3.14); // → number (дробные — тоже number)
console.log(typeoftrue); // → boolean
console.log(typeofundefined); // → undefined
typeof работает и с переменными — он смотрит на значение внутри:
25 — число, а "25" — строка из двух символов. Если число пришло в кавычках, считать с ним как с числом пока нельзя (про это — в разделах 5 и 6).
Можно редактировать · Ctrl + Enter
console.log(typeof25); // → number
console.log(typeof"25"); // → string
console.log(typeoftrue); // → boolean
console.log(typeof"true"); // → string — это просто текст из четырёх букв
null и undefined: в чём разница
Аналогия из жизни
Вы пришли в камеру хранения. undefined — ячейка есть, но в неё ещё ничего не положили («не задано»). null — в ячейке лежит записка «здесь намеренно пусто» («значение задано: ничего»).
Можно редактировать · Ctrl + Enter
let phone; // объявили, но не присвоили
console.log(phone); // → undefinedlet nickname = null; // мы сами решили: ника нет
console.log(nickname); // → null
Обычно undefined появляется «сам» (JavaScript говорит: «тут пусто, потому что вы ничего не положили»), а null программист записывает осознанно: «сейчас значения нет».
Странность typeof null
typeof null возвращает "object", хотя null — отдельный тип. Это известная ошибка, которая появилась в JavaScript в 1995 году и осталась навсегда: исправление сломало бы миллионы старых сайтов. Запомните как факт и не удивляйтесь — ИИ в ответах нередко путает именно это место.
Можно редактировать · Ctrl + Enter
console.log(typeofnull); // → object (!)
console.log(typeofundefined); // → 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(typeofSymbol("id")); // → symbol
Есть ещё «составной» тип object — для списков и объектов. Его мы разберём на уроках 6 и 7, а пока в нашем списке всего пять основных примитивных типов.
Пять отдельных команд: console.log(typeof price); и так далее.
Подсказка 2
Последняя строка кажется ошибкой — но это та самая странность typeof null. Так и должно быть.
ЗАДАЧА 2.2
Предскажи типы
средняя
Запишите в массив prediction тип каждого из девяти значений — строкой, например "number". Код сам сверит прогноз с настоящими результатами typeof: увидите «Верно!» — вы знаете типы.
Можно редактировать · Ctrl + Enter
// Впишите прогноз: тип каждого значения по порядку (каждое значение — текстом, как его покажет консоль)const prediction = ["", "", "", "", "", "", "", "", ""];
const actual = [
typeof42,
typeof"42",
typeof4.2,
typeof NaN,
typeofnull,
typeofundefined,
typeof (5 > 3),
typeof 10n,
typeofSymbol("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
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 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 — длина строки (без скобок: это свойство);
Собираем строки из переменных — только шаблонными литералами, без +.
ЗАДАЧА 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, дробная часть через точку). Для вычислений есть операторы — знаки действий.
Оператор % — «остаток» — проще всего понять на манты. 17 манты разложили по 5 штук на тарелку: получилось 3 полные тарелки (это Math.floor(17 / 5)), а 2 манты остались — это и есть 17 % 5. Остаток нужен, чтобы узнать, чётное ли число (n % 2 равно 0), или чтобы «зациклить» счёт — например, дни недели.
Деление часто даёт дробь. Для округления есть три команды, которые начинаются с 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); // → 200let 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); // → 6let b = 5;
console.log(++b); // → 6 — сначала увеличили, потом отдали
console.log(b); // → 6
Совет
Пока вы учитесь, используйте ++ и -- только отдельной строкой — visitors++;. Так не придётся гадать, какое значение получится.
Сравнения дают boolean
Знаки >, <, >=, <=, === (равно) и !== (не равно) сравнивают значения и возвращают true или false. Условия if, которые на этом строятся, мы будем изучать на уроке 3.
Что делать с деньгами: считать в наименьших единицах — в дирамах (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), потом разделили
Считаем в консоли — как на калькуляторе, только с переменными.
ЗАДАЧА 4.1
Манты на тарелках
лёгкая
На кухне приготовили 17 манты и раскладывают их по 5 на тарелку. Выведите, сколько тарелок получится полных и сколько манты останется. Используйте Math.floor и %.
В аудитории 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.
Самое важное преобразование. В реальной работе числа часто приходят как текст: из поля ввода, из ответа сервера. Пробелы по краям 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 / false
1 / 0
null
0
undefined
NaN
«Достать» число из текста: 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
Строка
Number
parseInt
parseFloat
"42"
42
42
42
"3.99"
3.99
3
3.99
"12px"
NaN
12
12
"px12"
NaN
NaN
NaN
""
0
NaN
NaN
Совет профессионалов: 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() недоступен, но вот как это выглядит в браузере:
Превращаем «текстовые» данные в числа и считаем с ними.
ЗАДАЧА 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 сомони за килограмм.
Попробуйте console.log(Number(weight)) — получите NaN: внутри есть «кг». Какая команда читает число до первого лишнего символа?
Подсказка 2
Вес дробный, поэтому нужен parseFloat(weight), а не parseInt — иначе получится 2 вместо 2.5.
06 Неявное приведение: главные ловушки
Если в выражении встречаются значения разных типов, JavaScript сам приводит их к общему виду — и не предупреждает. Иногда это удобно, но чаще становится источником странных ошибок. Ваша задача — понимать правила и уметь предсказывать результат.
Правило 1: «+» с текстом — это склейка
Если хотя бы одна сторона + — строка, JavaScript превращает вторую в строку и склеивает.
Знак + работает как клей. Рядом два числа — он складывает. Рядом хоть один текст — клеит: «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
Порядок слева направо
Выражение вычисляется по шагам слева направо. Пока слева числа — они складываются, а как только в цепочке появилась строка — дальше идёт склейка:
Плюс перед значением без левой части превращает его в число — так же, как 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(), и дальше работайте уже с числами. Явное лучше неявного: его видно в коде, и оно предсказуемо.
Предсказываем и чиним — главный навык этого раздела.
ЗАДАЧА 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 менять нельзя.
Сейчас выводится Итого: 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.
Скопируйте заготовку ниже в свой конспект (файл или заметки).
Заполните «постоянные» поля один раз: в «Контексте» напишите свой уровень и стек («чистый JavaScript, без библиотек, новичок»). Это будет одинаково в каждом промпте.
Придумайте свою «любимую» строку в «Проверке»: например, «покажи, что выведет консоль» или «назови 2 крайних случая». Её вы тоже оставите навсегда.
Протестируйте шаблон на задаче из урока: заполните поля и отправьте ИИ. Если ответ вас не устроил — уточните, в какой из четырёх частей не хватило деталей, и поправьте шаблон.
Контекст: [кто я, что уже умею, над чем работаю — например: «новичок, учу чистый JavaScript, знаю let/const и типы»]
Задача: [одно конкретное действие — объясни / проверь / дай 5 задач]
Ограничения: [что нельзя использовать, что обязательно; «новые термины объясняй одной фразой»]
Формат ответа: [как оформить: сначала правило, потом примеры; сколько примеров; без таблиц]
Проверка: [что ещё: «назови 2 места, где я могу ошибиться», «покажи, что выведет консоль»]
Хорошие рабочие промпты по этой теме
Из шпаргалки курса: «Вот код: [код]. Объясни построчно, что происходит и почему результат такой. Не переписывай код — только объясни.» И второй: «Дай 5 задач на [тема] уровня новичка, от простой к сложной, без решений.» Сверяйте объяснение с тем, что реально выводит консоль, а задачи — на соответствие теме и отсутствие готовых ответов.
Как читать ответ ИИ: проверяем, а не верим
ИИ пишет уверенно — даже когда ошибается. На теме типов это особенно заметно: неявное приведение и странности вроде typeof null он нередко пересказывает неверно. Поэтому у вас есть простой алгоритм:
Прогнозируйте. Прочитали объяснение ИИ — запишите, какой результат должен получиться.
Запускайте. Скопируйте пример в консоль и посмотрите, что выведется на самом деле.
Сверяйте. Совпало — отлично. Не совпало — ошибся либо ИИ, либо вы. Разберитесь, кто именно: в этом и есть обучение.
Переспрашивайте. Покажите ИИ реальный вывод: «в консоли получилось 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, в порядке возрастания).
Это основная часть занятия. Пятнадцать коротких задач — от простых к сложным. В каждой действует один и тот же ритм:
Прочитайте условие и код.
Предскажите результат — запишите в тетрадь.
Запустите и сверьте. Расхождение — повод вспомнить правило из урока.
Объясните соседу по парте, почему получилось именно так — вслух и своими словами.
Если застряли
Сначала перечитайте нужный раздел урока, потом откройте подсказку. Затем — спросите соседа. К ИИ обращайтесь после 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, что тип изменился.
Пока 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) оставляет один знак.
Если сложить строки через +, получится склейка "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.
Впишите в 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). Посчитайте сумму к оплате, округлите до целого и выведите.
Строки в числа через Number, затем умножение на количество и на TAX.
Подсказка 2
const total = Math.round(Number(priceText) * Number(countText) * TAX); — и вывести шаблонной строкой.
09 Домашнее задание
Домашняя работа — 10 задач и конспект по промптам. Результат: файл tasks-02.js и конспект с промптами. Решения пишите в обычном файле — запускайте через консоль браузера (вставляйте код) или в VS Code.
Как оформить tasks-02.js
Для каждой задачи — комментарий с номером и условием, затем код. В задачах на предсказание сначала пишите свой прогноз комментарием, потом код, который проверяет прогноз, а в конце комментарий «совпало» или «не совпало, потому что…».
10 задач
Паспорт данных. Объявите 8 переменных разных типов (string, number, boolean, null, undefined и ещё три на ваш выбор). Для каждой выведите значение и typeof.
Моя визитка. Данные о себе (имя, возраст, город, любимое блюдо) положите в const. Выведите многострочную визитку одним console.log с шаблонной строкой.
Конвертер валют. Курс USD_RATE = 10.95 положите в const. Сумма в долларах пришла строкой "250". Выведите сумму в сомони, округлив до двух знаков через toFixed(2).
Предскажи 8 выражений. Составьте самостоятельно 8 выражений с неявным приведением (+, -, *, true, null, undefined). Запишите прогноз, затем запустите и сверьте.
Часы и минуты. По количеству секунд (например, 10000) выведите время в формате «часы : минуты : секунды». Используйте Math.floor и %.
Починить три фрагмента. Напишите три коротких фрагмента с ошибкой приведения типов (склейка вместо сложения; NaN из-за undefined; нестрогое сравнение), а ниже — исправленную версию каждого.
Falsy-детектор. Выведите Boolean(...) для 12 разных значений (0, "", " ", "0", null, undefined, NaN, -1 и др.). Рядом комментарием — ваш прогноз.
Охота на NaN и Infinity. Найдите три разных способа получить NaN и два — Infinity. Проверьте NaN через Number.isNaN.
Деньги без ошибок. Корзина: три товара с ценами в сомони с копейками (например, 12.40, 7.35, 0.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.