$ sudo teach IT
МОДУЛЬ 2 · УРОК 2

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

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

⏱ ~25 минут 🎓 Для новичков ⚡ JavaScript

🧩 Что такое тип данных?

Не все данные одинаковы. Число 42 — это одно, текст «Привет, мир!» — другое, а значение «истина/ложь» — третье. Компьютеру важно знать, с чем именно он работает, потому что операции над числами — это одно (можно складывать, умножать), а над текстом — совсем другое (можно соединять, обрезать, искать).

Тип данных определяет, что именно хранится в переменной и какие операции с этим можно делать. JavaScript автоматически определяет тип — вам не нужно его явно указывать (в отличие от Java или C++).

В JavaScript есть 7 примитивных типов и один сложный тип (object). Примитивы — это базовые «атомарные» значения, которые нельзя разбить на части.

📝 String — строка

String — это текст. Любой текст: имя пользователя, сообщение в чате, URL страницы, ответ сервера. Строки заключаются в кавычки (одинарные, двойные или обратные).

let name = "Алиса";           // двойные кавычки
let city = 'Москва';           // одинарные кавычки
let greeting = `Привет, мир!`; // обратные кавычки (шаблонные строки)

let emptyStr = "";             // пустая строка — тоже строка!
let longText = "Это очень длинное предложение, которое может занимать несколько строк.";

console.log(typeof name);     // "string"
console.log(name.length);     // 5 (количество символов)

💡 Строки используются везде: имена, email-адреса, пароли (хешированные!), тексты сообщений, HTML-код, SQL-запросы, JSON-данные — всё это строки.

🔢 Number — число

Number — это числа. В JavaScript нет разделения на «целые» и «дробные» числа — все числа одного типа. Под капотом JavaScript хранит все числа как 64-битные числа с плавающей точкой (IEEE 754).

let age = 25;            // целое число
let price = 99.99;       // дробное число
let temperature = -15;   // отрицательное число
let big = 1_000_000;     // можно использовать _ для читаемости

console.log(typeof age);    // "number"
console.log(typeof price);  // "number" — оба числа одного типа!

Особые числовые значения:

let infinity = Infinity;         // бесконечность (например, 1 / 0)
let negInfinity = -Infinity;    // минус бесконечность
let notANumber = NaN;           // Not a Number — результат некорректной операции

console.log(1 / 0);             // Infinity
console.log(-1 / 0);            // -Infinity
console.log("abc" * 2);         // NaN — нельзя умножить текст на число
console.log(typeof NaN);        // "number" — да, NaN имеет тип number, вот такой парадокс!

✅ Boolean — булево значение

Boolean — это логический тип: всего два возможных значения — true (истина) и false (ложь). Без булевых значений невозможно написать ни одну полезную программу — они нужны везде, где есть выбор или условие.

let isLoggedIn = true;       // пользователь вошёл в систему
let isPremium = false;       // пользователь не подписчик
let hasAccess = true;        // есть доступ к материалу
let isEmailVerified = false; // email не подтверждён

console.log(typeof isLoggedIn);  // "boolean"

// Булевы значения появляются при сравнениях:
let age = 18;
console.log(age >= 18);      // true
console.log(age === 21);     // false

💡 Boolean — основа логики программ. Каждый раз, когда вы пишете if, вы проверяете булево значение. Авторизован ли пользователь? Достаточно ли денег на счёте? Нажата ли кнопка? — всё это boolean.

🚫 null — намеренная пустота

null — специальное значение, означающее «намеренно пусто», «значения нет». Это не ошибка — это сознательное решение программиста сказать: «здесь пусто, я это знаю».

let selectedUser = null;     // пользователь ещё не выбран
let currentVideo = null;     // видео ещё не загружено
let errorMessage = null;     // ошибок нет

// Позже можно присвоить реальное значение:
selectedUser = { name: "Иван", age: 25 };

// Интересный факт — маленький исторический баг JavaScript:
console.log(typeof null);    // "object" — это ОШИБКА в JS, оставленная для совместимости!
                              // null — не объект, но typeof возвращает "object"

⚠️ typeof null === "object" — это известный исторический баг JavaScript, который не исправляют из-за обратной совместимости. Помните об этом: null — это примитив, не объект, несмотря на то что говорит typeof.

❓ undefined — значение не задано

undefined означает «значение не было задано». Это то, что JavaScript ставит автоматически, если значение не было присвоено. В отличие от null, это не намеренное «пусто» — это «ещё не задано» или «не существует».

let x;                       // объявлена, но не инициализирована
console.log(x);              // undefined

function greet(name) {
  console.log(name);         // если не передать аргумент — будет undefined
}
greet();                     // undefined

const user = { name: "Иван" };
console.log(user.email);     // undefined — свойство не существует

console.log(typeof undefined); // "undefined"
console.log(typeof x);         // "undefined"
null

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

undefined

Значение не было задано. JavaScript сам ставит undefined, когда переменная есть, но значения у неё нет. Типичный пример: переменная объявлена, но не инициализирована.

🔮 Symbol и BigInt — для продвинутых

Ещё два примитива — они редко встречаются у новичков, но важно знать об их существовании.

Symbol

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

const id1 = Symbol("id");
const id2 = Symbol("id");
console.log(id1 === id2); // false!
BigInt

Целые числа произвольной точности. Обычный Number имеет ограничение (~53 бита). BigInt нужен для работы с очень большими числами — криптография, финансы. Записывается с суффиксом n.

const big = 9007199254740993n;
console.log(typeof big); // "bigint"

🔍 Оператор typeof

typeof — это оператор, который возвращает тип значения в виде строки. Очень полезен при отладке — когда непонятно, что именно хранится в переменной.

console.log(typeof "Привет");     // "string"
console.log(typeof 42);            // "number"
console.log(typeof 3.14);          // "number"
console.log(typeof true);          // "boolean"
console.log(typeof false);         // "boolean"
console.log(typeof undefined);     // "undefined"
console.log(typeof null);          // "object"  ← исторический баг!
console.log(typeof Symbol());      // "symbol"
console.log(typeof 100n);          // "bigint"
console.log(typeof { name: "X" }); // "object"
console.log(typeof function(){}); // "function"

💡 Запомните: typeof null === "object" — это баг в языке, исправить который невозможно (сломаются миллиарды сайтов). Если нужно проверить, что значение — именно null, используйте строгое сравнение: value === null.

✅ Итоги урока

  • string — текст. В кавычках: одинарных, двойных или обратных
  • number — числа (целые и дробные в одном типе). Плюс Infinity и NaN
  • boolean — истина (true) или ложь (false). Основа логики программ
  • null — намеренная пустота, поставленная программистом
  • undefined — значение не задано (JavaScript ставит автоматически)
  • symbol — уникальный идентификатор (для продвинутых)
  • bigint — очень большие целые числа (для продвинутых)
  • typeof позволяет узнать тип значения. Исключение: typeof null === "object" — баг
  • null — намеренная пустота. undefined — значение не было задано

В следующем уроке детально разберём строки — один из самых часто используемых типов данных. 🚀

Тест: Примитивные типы данных

7 вопросов

Типы данных

Создайте три переменные: productName со строкой "Ноутбук", productPrice с числом 79990 и isAvailable с булевым true.

null и undefined

Создайте переменную selectedCategory со значением null. Создайте переменную discount без присваивания значения.