Learning Book

Примитивные типы

Примитивные типы

В JavaScript 7 примитивных типов. Примитивы — неизменяемые (immutable) значения, которые хранятся непосредственно, а не по ссылке.

string

Строки в JavaScript — последовательности символов Unicode. Иммутабельны.

const greeting = 'Привет';       // одинарные кавычки
const name = "Мир";              // двойные кавычки
const message = `${greeting}, ${name}!`; // шаблонный литерал

// Строки иммутабельны
let str = 'hello';
str[0] = 'H'; // Не работает — строка не изменится
str = 'Hello'; // Это работает — создаётся новая строка

number

JavaScript использует формат IEEE 754 (64-bit floating point) для всех чисел.

const integer = 42;
const float = 3.14;
const negative = -7;

// Специальные значения
const infinity = Infinity;
const negInfinity = -Infinity;
const notANumber = NaN;

// NaN — особое значение: не равно даже самому себе
console.log(NaN === NaN); // false
console.log(Number.isNaN(NaN)); // true — правильная проверка

// Проблема точности float
console.log(0.1 + 0.2); // 0.30000000000000004
0.1 + 0.2 !== 0.3 — это не баг JavaScript, а особенность IEEE 754. Для денег используйте целые числа (копейки) или библиотеку Decimal.

boolean

Два значения: true и false.

const isActive = true;
const isEmpty = false;
const isAdmin = user.role === 'admin'; // результат сравнения

null

null означает намеренное отсутствие значения — разработчик явно сказал “здесь пусто”.

let selectedUser = null; // пользователь ещё не выбран

// null — это примитив, но typeof возвращает 'object' (исторический баг)
typeof null; // 'object' — известный баг JavaScript, не исправлен для обратной совместимости

undefined

undefined — переменная объявлена, но значение не присвоено.

let uninitialised; // undefined — JS автоматически
console.log(uninitialised); // undefined

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

symbol (ES6)

Symbol — уникальный идентификатор. Два символа с одинаковым описанием НЕ равны.

const id1 = Symbol('id');
const id2 = Symbol('id');
console.log(id1 === id2); // false — каждый Symbol уникален

// Применение: уникальные ключи объекта
const ID = Symbol('userId');
const user = {
  name: 'Иван',
  [ID]: 42 // символьный ключ не отображается в for...in
};

bigint (ES2020)

BigInt для чисел, превышающих Number.MAX_SAFE_INTEGER (2^53 - 1).

const big = 9007199254740991n; // суффикс n
const sum = big + 1n; // 9007199254740992n

// Нельзя смешивать number и bigint
42 + 1n; // TypeError
Number(42n) + 1; // 43 — явное приведение

Это исторический баг JavaScript из 1995 года. В первой реализации движка значения хранились с тегом типа в первых битах. Тег для объектов был 000. Значение null представлялось как нулевой указатель — тоже 000. Поэтому typeof null вернул ‘object’.

Баг был обнаружен быстро, но к тому времени уже существовал код, который полагался на typeof null === ‘object’. Исправление сломало бы миллионы сайтов. Баг остался в спецификации навсегда.