ШПАРГАЛКА

JavaScript

Шпаргалка по JavaScript: переменные, типы, операторы, строки, массивы, объекты, циклы, функции, классы, модули, DOM, async/await — кратко с примерами.

Краткая выжимка по основам JavaScript: синтаксис, типы данных, коллекции, функции, классы, модули, работа с DOM и асинхронность. Каждый блок — с рабочими примерами и комментарием // результат. Держите под рукой, когда пишете код или готовитесь к собеседованию.

Переменные: let, const, var

const — для значений, которые не переприсваиваются (по умолчанию используйте именно его). let — когда значение меняется. var — устаревший способ, остаётся в legacy-коде; у него функциональная область видимости и всплытие (hoisting).

const PI = 3.14;     // переприсвоить нельзя
let count = 0;
count = count + 1;   // 1

const user = { name: "Аня" };
user.name = "Боря";  // OK: меняем содержимое, а не ссылку
console.log(user.name); // Боря

// const и let имеют блочную область видимости
if (true) {
  let x = 10;
}
// console.log(x); // ReferenceError: x is not defined

Типы данных и проверка typeof

В JavaScript есть примитивы: number, string, boolean, null, undefined, symbol, bigint — и объекты (включая массивы и функции). Оператор typeof возвращает строку с названием типа.

typeof 42;          // "number"
typeof "привет";    // "string"
typeof true;        // "boolean"
typeof undefined;   // "undefined"
typeof null;        // "object" (историческая ошибка языка)
typeof {};          // "object"
typeof [];          // "object"  (массив — тоже объект)
typeof function(){}; // "function"
typeof 10n;         // "bigint"

// Проверка массива — отдельно:
Array.isArray([1, 2]); // true

Операторы и сравнения: == vs ===

=== (строгое равенство) сравнивает и значение, и тип — используйте его по умолчанию. == (нестрогое) приводит типы перед сравнением и даёт неожиданные результаты.

5 === 5;     // true
5 === "5";   // false (разные типы)
5 == "5";    // true  (строка приведена к числу)

0 == false;     // true
"" == false;    // true
null == undefined; // true
null === undefined; // false
NaN === NaN;    // false (NaN не равен ничему)

// Логические и нулевого слияния
true && "да";   // "да"
false || "запасной"; // "запасной"
null ?? "по умолчанию"; // "по умолчанию" (?? срабатывает на null/undefined)

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

Шаблонные литералы в обратных кавычках позволяют подставлять выражения через ${...} и писать многострочный текст. У строк много полезных методов.

const name = "Мир";
const greeting = `Привет, ${name}!`;
console.log(greeting); // Привет, Мир!

const sum = `2 + 2 = ${2 + 2}`; // "2 + 2 = 4"

const s = "JavaScript";
s.length;            // 10
s.toUpperCase();     // "JAVASCRIPT"
s.includes("Script");// true
s.slice(0, 4);       // "Java"
s.replace("Java", "Type"); // "TypeScript"
"  отступ  ".trim(); // "отступ"
"a,b,c".split(",");  // ["a", "b", "c"]

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

Массив — упорядоченный список. Часть методов изменяет исходный массив (push, splice), часть возвращает новый (map, filter, slice).

const nums = [3, 1, 2];
nums.push(4);        // добавить в конец -> [3, 1, 2, 4]
nums.pop();          // удалить с конца -> вернёт 4
nums.length;         // 3

[1, 2, 3].map(n => n * 2);       // [2, 4, 6]
[1, 2, 3, 4].filter(n => n % 2 === 0); // [2, 4]
[1, 2, 3, 4].reduce((a, b) => a + b, 0); // 10
[1, 2, 3].find(n => n > 1);       // 2
[1, 2, 3].includes(2);            // true
[3, 1, 2].sort((a, b) => a - b);  // [1, 2, 3]
[1, 2, 3].join("-");              // "1-2-3"

Объекты

Объект хранит данные в виде пар «ключ — значение». Доступ — через точку или квадратные скобки.

const user = {
  name: "Аня",
  age: 25,
  greet() { return `Я ${this.name}`; }
};

user.name;          // "Аня"
user["age"];        // 25
user.greet();       // "Я Аня"

user.city = "Москва"; // добавить свойство
delete user.age;      // удалить свойство

Object.keys(user);    // ["name", "greet", "city"]
Object.values({a: 1, b: 2}); // [1, 2]
Object.entries({a: 1});      // [["a", 1]]

// Короткая запись при совпадении имён
const x = 10, y = 20;
const point = { x, y }; // { x: 10, y: 20 }

Условия: if, switch, тернарный оператор

Ветвление: if/else для условий, switch для выбора по значению, тернарный оператор ?: для коротких выражений.

const age = 18;

if (age >= 18) {
  console.log("взрослый");
} else {
  console.log("несовершеннолетний");
}
// взрослый

// Тернарный оператор
const status = age >= 18 ? "можно" : "нельзя";
console.log(status); // можно

// switch
const day = 2;
switch (day) {
  case 1: console.log("Пн"); break;
  case 2: console.log("Вт"); break; // Вт
  default: console.log("другой");
}

Циклы: for, for..of, for..in, while

for — классический счётчик. for..of — по значениям массива/строки. for..in — по ключам объекта. while — пока условие истинно.

for (let i = 0; i < 3; i++) {
  console.log(i); // 0, 1, 2
}

for (const item of ["a", "b"]) {
  console.log(item); // "a", "b"
}

const obj = { x: 1, y: 2 };
for (const key in obj) {
  console.log(key); // "x", "y"
}

let n = 3;
while (n > 0) {
  n--; // 2, 1, 0
}
console.log(n); // 0

Функции

Обычные функции, стрелочные, параметры по умолчанию, остаточные параметры (rest) и расширение (spread).

// Обычная функция
function add(a, b) {
  return a + b;
}
add(2, 3); // 5

// Стрелочная функция
const square = n => n * n;
square(4); // 16

// Параметры по умолчанию
function greet(name = "гость") {
  return `Привет, ${name}`;
}
greet();        // "Привет, гость"
greet("Аня");   // "Привет, Аня"

// rest: собрать аргументы в массив
function sum(...nums) {
  return nums.reduce((a, b) => a + b, 0);
}
sum(1, 2, 3); // 6

// spread: развернуть массив в аргументы
const arr = [1, 2, 3];
Math.max(...arr); // 3
const copy = [...arr, 4]; // [1, 2, 3, 4]

Деструктуризация

Деструктуризация распаковывает значения из массивов и объектов в отдельные переменные.

// Из массива
const [first, second] = [10, 20];
first;  // 10
second; // 20

// Из объекта
const { name, age } = { name: "Аня", age: 25 };
name; // "Аня"
age;  // 25

// Со значением по умолчанию и переименованием
const { city = "Москва", name: userName } = { name: "Боря" };
city;     // "Москва"
userName; // "Боря"

// В параметрах функции
function show({ title }) { return title; }
show({ title: "Книга" }); // "Книга"

Замыкания (кратко)

Замыкание — функция, которая «запоминает» переменные из области, где была создана, даже после её завершения. Часто применяют для приватного состояния.

function makeCounter() {
  let count = 0; // приватная переменная
  return function () {
    count++;
    return count;
  };
}

const counter = makeCounter();
counter(); // 1
counter(); // 2
counter(); // 3
// count снаружи недоступна — она «замкнута» внутри

Классы

Классы — синтаксический сахар над прототипами: конструктор, методы, наследование через extends и super.

class Animal {
  constructor(name) {
    this.name = name;
  }
  speak() {
    return `${this.name} издаёт звук`;
  }
}

class Dog extends Animal {
  speak() {
    return `${this.name} лает`;
  }
}

const dog = new Dog("Рекс");
dog.speak();     // "Рекс лает"
dog.name;        // "Рекс"
dog instanceof Animal; // true

Модули: import и export

Модули позволяют разбивать код на файлы. Бывает именованный экспорт (несколько на файл) и экспорт по умолчанию (один на файл).

// math.js — именованный экспорт
export const PI = 3.14;
export function add(a, b) { return a + b; }

// utils.js — экспорт по умолчанию
export default function greet(name) {
  return `Привет, ${name}`;
}

// app.js — импорт
import greet, { PI, add } from "./math.js";
import { add as plus } from "./math.js"; // переименование

add(2, 3); // 5
PI;        // 3.14

Работа с DOM (кратко)

DOM — представление HTML-страницы в виде объектов. Через JavaScript можно находить элементы, менять их и навешивать обработчики событий.

// Поиск элементов
const btn = document.querySelector("#run");      // первый по селектору
const items = document.querySelectorAll(".item"); // все подходящие

// Изменение содержимого и стилей
const box = document.querySelector(".box");
box.textContent = "Привет";
box.classList.add("active");
box.style.color = "red";

// Обработка событий
btn.addEventListener("click", () => {
  console.log("Кнопка нажата");
});

// Создание и вставка элемента
const li = document.createElement("li");
li.textContent = "Новый пункт";
document.querySelector("ul").append(li);

async / await (кратко)

Асинхронный код без «лесенки» колбэков. async-функция всегда возвращает промис; await ждёт результат промиса. Ошибки ловятся через try/catch.

async function loadUser(id) {
  try {
    const response = await fetch(`/api/users/${id}`);
    const data = await response.json();
    return data; // объект пользователя
  } catch (error) {
    console.error("Ошибка загрузки", error);
  }
}

// Вызов: async-функция возвращает промис
loadUser(1).then(user => {
  console.log(user);
});

// Несколько запросов параллельно
const [a, b] = await Promise.all([
  fetch("/a"),
  fetch("/b")
]); // дождётся обоих
Поддержать проект