LEARN X · ЗА 16 МИН
JavaScript
JavaScript за 16 минут: весь язык на одной странице через закомментированный код — переменные, строки, массивы, объекты, функции, классы, промисы, модули.
JavaScript — язык браузеров, серверов (Node.js) и почти всего остального. Ниже весь язык на одной странице: читай сверху вниз как единый скрипт, всё объяснение — в комментариях кода. Запускай куски в консоли браузера (F12) и смотри результаты после // =>.
1. Вывод и комментарии
// Это однострочный комментарий — от // до конца строки.
/* А это многострочный
комментарий на несколько строк. */
// console.log — главный инструмент отладки, печатает в консоль:
console.log("Привет, мир!"); // => Привет, мир!
console.log(2 + 2); // => 4
console.log("a", "b", 3); // можно несколько аргументов => a b 3
console.warn("предупреждение"); // жёлтое сообщение
console.error("ошибка"); // красное сообщение
2. Переменные
Объявляй переменные через let (можно менять) и const (константа). Старое var почти не используют.
let age = 25; // изменяемая переменная
age = 26; // можно переприсвоить
const name = "Аня"; // константа — переприсвоить нельзя
// name = "Боря"; // => TypeError: Assignment to constant variable
var old = 1; // устаревший способ, избегай его
// Основные типы данных:
let n = 42; // number — число (целые и дробные вместе)
let f = 3.14; // тоже number
let s = "текст"; // string — строка
let flag = true; // boolean — true / false
let nothing = null; // null — намеренное «пусто»
let undef = undefined; // undefined — значение не задано
let big = 9007199254740991n; // bigint — большие целые
let sym = Symbol("id"); // symbol — уникальный идентификатор
// typeof возвращает тип значения строкой:
console.log(typeof n); // => "number"
console.log(typeof s); // => "string"
console.log(typeof flag); // => "boolean"
console.log(typeof undef); // => "undefined"
console.log(typeof null); // => "object" (историческая ошибка JS!)
console.log(typeof {}); // => "object"
console.log(typeof []); // => "object" (массив — это объект)
console.log(typeof function(){}); // => "function"
3. Числа и операторы
// Арифметика:
console.log(5 + 2); // => 7 сложение
console.log(5 - 2); // => 3 вычитание
console.log(5 * 2); // => 10 умножение
console.log(5 / 2); // => 2.5 деление (всегда дробное!)
console.log(5 % 2); // => 1 остаток от деления
console.log(5 ** 2); // => 25 возведение в степень
// Инкремент и декремент:
let x = 10;
x++; // x стало 11
x--; // x стало 10
x += 5; // x += 5 — то же что x = x + 5 => 15
// Сравнения возвращают boolean:
console.log(2 > 1); // => true
console.log(2 <= 2); // => true
// ВАЖНО: === строгое сравнение (без приведения типов), == нестрогое.
console.log(1 === 1); // => true
console.log(1 === "1"); // => false (разные типы)
console.log(1 == "1"); // => true (== приводит "1" к числу — опасно!)
console.log(0 == false);// => true (тоже приведение)
console.log(0 === false);// => false
// Правило: всегда используй === и !==, забудь про == и !=.
// Полезные функции и значения:
console.log(Math.max(1, 5, 3)); // => 5
console.log(Math.round(4.6)); // => 5
console.log(Math.floor(4.9)); // => 4
console.log(Math.random()); // случайное число [0, 1)
console.log(Number("42")); // строка -> число => 42
console.log(parseInt("42px")); // => 42
console.log(0.1 + 0.2); // => 0.30000000000000004 (плавающая точка!)
console.log(NaN); // "не число" — результат битой арифметики
console.log(Infinity); // бесконечность
4. Строки
let a = "двойные";
let b = 'одинарные'; // кавычки равнозначны
// Шаблонные литералы (обратные кавычки `) — вставка через ${...}:
let user = "Аня";
let greet = `Привет, ${user}! 2+2=${2 + 2}`;
console.log(greet); // => Привет, Аня! 2+2=4
// Многострочный текст — тоже через обратные кавычки:
let multi = `строка 1
строка 2`;
// Конкатенация через +:
console.log("abc" + "def"); // => "abcdef"
// Методы строк (строки неизменяемы — методы возвращают новую строку):
let str = "Hello, World";
console.log(str.length); // => 12 (это свойство, не метод)
console.log(str.toUpperCase()); // => "HELLO, WORLD"
console.log(str.toLowerCase()); // => "hello, world"
console.log(str.includes("World"));// => true
console.log(str.startsWith("He")); // => true
console.log(str.indexOf("World")); // => 7
console.log(str.slice(0, 5)); // => "Hello"
console.log(str.replace("World", "JS")); // => "Hello, JS"
console.log(" trim ".trim()); // => "trim"
console.log("a,b,c".split(",")); // => ["a", "b", "c"]
console.log("ab".repeat(3)); // => "ababab"
console.log(str[0]); // => "H" (доступ по индексу)
5. Массивы
let arr = [1, 2, 3, "строка", true]; // элементы любых типов
console.log(arr[0]); // => 1 (индексы с нуля)
console.log(arr.length); // => 5
arr[1] = 20; // массивы изменяемы
// Добавление и удаление:
arr.push("конец"); // добавить в конец
arr.pop(); // удалить с конца (и вернуть)
arr.unshift("начало"); // добавить в начало
arr.shift(); // удалить с начала
let nums = [1, 2, 3, 4, 5];
console.log(nums.includes(3)); // => true
console.log(nums.indexOf(3)); // => 2
console.log(nums.join("-")); // => "1-2-3-4-5"
console.log(nums.slice(1, 3)); // => [2, 3] (не меняет оригинал)
console.log([3, 1, 2].sort()); // => [1, 2, 3]
console.log([1, 2, 3].reverse()); // => [3, 2, 1]
// Функциональные методы — основа повседневного JS:
// map — преобразовать каждый элемент, вернуть новый массив:
console.log(nums.map(x => x * 2)); // => [2, 4, 6, 8, 10]
// filter — оставить подходящие элементы:
console.log(nums.filter(x => x % 2 === 0)); // => [2, 4]
// reduce — свернуть массив в одно значение (0 — старт аккумулятора):
console.log(nums.reduce((sum, x) => sum + x, 0)); // => 15
// find — первый подходящий элемент:
console.log(nums.find(x => x > 3)); // => 4
// some / every — хотя бы один / все:
console.log(nums.some(x => x > 4)); // => true
console.log(nums.every(x => x > 0)); // => true
// Спред-оператор (...) — "разворачивает" массив:
let more = [...nums, 6, 7]; // копия + новые => [1,2,3,4,5,6,7]
let merged = [...[1, 2], ...[3, 4]]; // => [1, 2, 3, 4]
let copy = [...nums]; // поверхностная копия
console.log(Math.max(...nums)); // => 5 (массив как аргументы)
6. Объекты
// Объект — набор пар ключ: значение:
let person = {
name: "Аня",
age: 25,
isAdmin: false,
greet() { // метод (функция внутри объекта)
return `Привет, я ${this.name}`; // this — сам объект
}
};
// Доступ к свойствам:
console.log(person.name); // => "Аня" (через точку)
console.log(person["age"]); // => 25 (через скобки)
console.log(person.greet()); // => "Привет, я Аня"
person.city = "Москва"; // добавить свойство
delete person.isAdmin; // удалить свойство
// Деструктуризация — вытащить свойства в переменные:
const { name, age } = person;
console.log(name, age); // => "Аня" 25
const { city = "неизвестно" } = person; // со значением по умолчанию
// Спред для объектов — копирование и слияние:
let base = { a: 1, b: 2 };
let extended = { ...base, c: 3 }; // => { a: 1, b: 2, c: 3 }
let override = { ...base, b: 99 };// => { a: 1, b: 99 }
// Сокращённая запись свойств:
let xx = 1, yy = 2;
let point = { xx, yy }; // => { xx: 1, yy: 2 }
// Перебор объекта:
console.log(Object.keys(base)); // => ["a", "b"]
console.log(Object.values(base)); // => [1, 2]
console.log(Object.entries(base));// => [["a",1], ["b",2]]
7. Условия
let score = 75;
// if / else if / else:
if (score >= 90) {
console.log("отлично");
} else if (score >= 60) {
console.log("норм"); // => норм
} else {
console.log("плохо");
}
// Тернарный оператор — короткое if/else как выражение:
let status = score >= 60 ? "сдал" : "не сдал";
console.log(status); // => "сдал"
// switch — выбор по значению:
let day = 3;
switch (day) {
case 1: console.log("Пн"); break; // break обязателен!
case 3: console.log("Ср"); break; // => Ср
default: console.log("другой день");
}
// Ложные (falsy) значения: false, 0, "", null, undefined, NaN.
// Всё остальное — истинно (truthy).
if ("") console.log("не выполнится");
if ("текст") console.log("выполнится"); // => выполнится
// ?. — опциональная цепочка: безопасный доступ, без ошибки:
let u = { profile: { name: "Аня" } };
console.log(u.profile?.name); // => "Аня"
console.log(u.address?.city); // => undefined (а не ошибка!)
// ?? — оператор нулевого слияния: запасное значение, если null/undefined:
let input = null;
console.log(input ?? "по умолчанию"); // => "по умолчанию"
console.log(0 ?? "запас"); // => 0 (0 не null, в отличие от ||)
8. Циклы
// Классический for: (старт; условие; шаг)
for (let i = 0; i < 3; i++) {
console.log(i); // => 0, 1, 2
}
// for..of — перебор ЗНАЧЕНИЙ массива (или строки, Set, Map):
for (const item of ["a", "b", "c"]) {
console.log(item); // => a, b, c
}
// for..in — перебор КЛЮЧЕЙ объекта:
let obj = { x: 1, y: 2 };
for (const key in obj) {
console.log(key, obj[key]); // => x 1, y 2
}
// while — пока условие истинно:
let n = 3;
while (n > 0) {
console.log(n); // => 3, 2, 1
n--;
}
// do..while — тело выполнится хотя бы раз:
let k = 0;
do {
console.log("раз"); // => раз (выполнится один раз)
k++;
} while (k < 0);
// forEach — метод массива, для каждого элемента вызывает функцию:
[10, 20, 30].forEach((value, index) => {
console.log(index, value); // => 0 10, 1 20, 2 30
});
// break прерывает цикл, continue пропускает итерацию:
for (let i = 0; i < 5; i++) {
if (i === 1) continue; // пропустить 1
if (i === 3) break; // выйти на 3
console.log(i); // => 0, 2
}
9. Функции
// Объявление функции:
function add(a, b) {
return a + b; // return возвращает результат
}
console.log(add(2, 3)); // => 5
// Функциональное выражение (функция как значение):
const multiply = function (a, b) {
return a * b;
};
// Стрелочная функция — короткий синтаксис:
const square = (x) => x * x; // одно выражение — return неявный
const sum = (a, b) => a + b;
const hello = () => "привет"; // без аргументов
const withBody = (x) => { // с телом — return нужен явно
const r = x * 2;
return r;
};
console.log(square(4)); // => 16
// Параметры по умолчанию:
function greet(name = "гость") {
return `Привет, ${name}`;
}
console.log(greet()); // => "Привет, гость"
console.log(greet("Аня")); // => "Привет, Аня"
// Rest-параметры (...) — собрать все аргументы в массив:
function total(...numbers) {
return numbers.reduce((s, n) => s + n, 0);
}
console.log(total(1, 2, 3, 4)); // => 10
// Замыкание — функция запоминает переменные из внешней области:
function counter() {
let count = 0; // живёт между вызовами
return () => ++count; // внутренняя функция помнит count
}
const next = counter();
console.log(next()); // => 1
console.log(next()); // => 2
console.log(next()); // => 3 (count сохраняется!)
10. Классы
class Animal {
constructor(name) { // конструктор — вызывается при new
this.name = name; // this — создаваемый объект
}
speak() { // метод
return `${this.name} издаёт звук`;
}
get label() { // геттер — обращение как к свойству
return `Животное: ${this.name}`;
}
static create(name) { // статический метод — у класса, не у объекта
return new Animal(name);
}
}
const cat = new Animal("Кот"); // new создаёт экземпляр
console.log(cat.speak()); // => "Кот издаёт звук"
console.log(cat.label); // => "Животное: Кот" (без скобок — геттер)
console.log(Animal.create("Пёс").name); // => "Пёс"
// Наследование через extends:
class Dog extends Animal {
constructor(name, breed) {
super(name); // super вызывает конструктор родителя
this.breed = breed;
}
speak() { // переопределяем метод
return `${this.name} лает! (${this.breed})`;
}
}
const rex = new Dog("Рекс", "овчарка");
console.log(rex.speak()); // => "Рекс лает! (овчарка)"
console.log(rex.label); // => "Животное: Рекс" (унаследован)
console.log(rex instanceof Animal); // => true
11. Промисы и async/await
Промис (Promise) — обещание результата, который придёт позже (запрос к серверу, таймер). async/await — удобный синтаксис над промисами.
// Промис может выполниться (resolve) или провалиться (reject):
const promise = new Promise((resolve, reject) => {
const ok = true;
if (ok) resolve("успех");
else reject("ошибка");
});
// Обработка через .then / .catch / .finally:
promise
.then(result => console.log(result)) // => "успех"
.catch(err => console.log(err)) // при reject
.finally(() => console.log("готово")); // в любом случае
// Функция, возвращающая промис (имитация запроса):
function fetchUser(id) {
return new Promise(resolve => {
setTimeout(() => resolve({ id, name: "Аня" }), 100);
});
}
// async/await — пишем асинхронный код как обычный:
async function main() {
const user = await fetchUser(1); // await ждёт результата промиса
console.log(user.name); // => "Аня"
try {
const data = await fetchUser(2);
console.log(data.id); // => 2
} catch (err) {
console.log("Поймали ошибку:", err);
}
}
main();
// Параллельное выполнение нескольких промисов:
async function loadAll() {
const users = await Promise.all([fetchUser(1), fetchUser(2)]);
console.log(users.length); // => 2 (оба завершились)
}
loadAll();
12. Модули (import / export)
Большие программы разбивают на файлы-модули. Один файл экспортирует, другой импортирует.
// === файл math.js ===
export const PI = 3.14159; // именованный экспорт
export function add(a, b) { // именованный экспорт
return a + b;
}
export default function square(x) { // экспорт по умолчанию (один на файл)
return x * x;
}
// === файл app.js ===
// Импорт default (имя выбираешь сам) + именованных в { }:
import square, { PI, add } from "./math.js";
console.log(PI); // => 3.14159
console.log(add(2, 3)); // => 5
console.log(square(4)); // => 16
// Импорт с переименованием:
import { add as sum } from "./math.js";
console.log(sum(1, 1)); // => 2
// Импорт всего модуля одним объектом:
import * as math from "./math.js";
console.log(math.PI); // => 3.14159
// В браузере подключают так: <script type="module" src="app.js"></script>
13. Полезное напоследок
// Map — словарь с ключами любого типа (не только строки):
const map = new Map();
map.set("name", "Аня");
map.set(1, "число-ключ");
console.log(map.get("name")); // => "Аня"
console.log(map.has(1)); // => true
console.log(map.size); // => 2
map.delete(1);
for (const [key, value] of map) console.log(key, value);
// Set — коллекция уникальных значений:
const set = new Set([1, 2, 2, 3, 3, 3]);
console.log(set.size); // => 3 (дубликаты убраны)
console.log(set.has(2)); // => true
console.log([...set]); // => [1, 2, 3] (обратно в массив)
// JSON — обмен данными между сервером и клиентом:
const obj = { name: "Аня", age: 25, tags: ["a", "b"] };
const json = JSON.stringify(obj); // объект -> строка
console.log(json); // => '{"name":"Аня","age":25,"tags":["a","b"]}'
const back = JSON.parse(json); // строка -> объект
console.log(back.age); // => 25
// Опциональная цепочка с методами и массивами:
const data = { list: [{ id: 1 }] };
console.log(data.list?.[0]?.id); // => 1
console.log(data.missing?.fn?.()); // => undefined (без ошибки)
// Date — работа с датами (кратко):
const now = new Date(); // текущий момент
console.log(now.getFullYear()); // => например 2026
console.log(now.getMonth()); // => 0..11 (январь = 0!)
const d = new Date("2026-06-16"); // из строки ISO
console.log(d.getDate()); // => 16
console.log(Date.now()); // миллисекунды с 1970 года
// На этом экспресс-тур окончен. Открывай консоль (F12) и пробуй!