> Какие примитивные типы существуют в JavaScript? (JavaScript)

Уровень: senior · Роль: frontend · Категория: Технические вопросы

Компании: Garage Eight, Верме, VK

Стек: JavaScript

> Пример ответа

Короткий ответ

В JavaScript существует 7 примитивных типов: string, number, bigint, boolean, undefined, symbol, null. Все, кроме null и undefined, имеют объектные обёртки. Примитивы неизменяемы и передаются по значению, в отличие от объектов, которые передаются по ссылке. Тип null технически является object из-за исторической ошибки в typeof.

Подробное объяснение

Примитивные типы - это фундаментальные строительные блоки данных в JavaScript. Они не являются объектами и не имеют собственных методов (кроме временного автоупаковывания в объектные обёртки). Каждый примитив представляет одно значение.

  • string - последовательность символов в кавычках. Неизменяема, любая операция создаёт новую строку.
  • number - числа с плавающей точкой двойной точности (64-bit IEEE 754), включая NaN, Infinity, -Infinity.
  • bigint - целые числа произвольной точности, создаются через суффикс n или функцию BigInt().
  • boolean - true или false.
  • undefined - значение по умолчанию для неинициализированных переменных и отсутствующих свойств.
  • symbol - уникальные и неизменяемые идентификаторы, часто используются как ключи объектов для избежания коллизий.
  • null - намеренное отсутствие значения. typeof null === "object" - известная ошибка из ранних версий JS.

Все примитивы, кроме null и undefined, имеют объектные обёртки (String, Number, Boolean, BigInt, Symbol), которые позволяют временно вызывать методы на примитивах. Это называется autoboxing.

На практике

При работе с примитивами важно помнить о неявном приведении типов. Например, "5" - 1 даёт 4, а "5" + 1 - "51". Для сравнения используйте строгое равенство ===, чтобы избежать неожиданных преобразований.

bigint несовместим с обычными числами в арифметических операциях - требуется явное преобразование. symbol всегда уникален, даже если создан с одинаковым описанием: Symbol("id") !== Symbol("id").

Проверка на null часто делается через === null, а на undefined - через typeof x === "undefined" или === undefined.

Пример кода

JAVASCRIPT
// Примитивные типы
const str = "hello"; // string
const num = 42; // number
const big = 9007199254740991n; // bigint
const bool = true; // boolean
const undef = undefined; // undefined
const sym = Symbol("key"); // symbol
const empty = null; // null
// Autoboxing
console.log("hello".toUpperCase()); // "HELLO" - временная обёртка String
// Проверка типов
console.log(typeof null); // "object" - историческая ошибка
console.log(typeof undefined); // "undefined"
console.log(typeof Symbol()); // "symbol"
// Сравнение
console.log(0 == false); // true - неявное приведение
console.log(0 === false); // false - строгое сравнение
// Bigint и number несовместимы
// console.log(1n + 1); // TypeError
console.log(Number(1n) + 1); // 2 - явное преобразование

Как отвечать на собеседовании

Начните с перечисления всех 7 типов, затем выделите ключевые особенности: неизменяемость, передача по значению, autoboxing. Упомяните typeof null как исторический баг. Если спросят про разницу с объектами, подчеркните, что примитивы - это значения, а объекты - ссылки. Для senior-уровня добавьте детали про bigint и symbol, их практическое применение и ограничения.

Что проверяет интервьюер

  • Знание полного списка примитивов (особенно bigint и symbol как более новые).
  • Понимание разницы между примитивами и объектами (значение vs ссылка, неизменяемость).
  • Осведомлённость о подводных камнях: typeof null, autoboxing, неявное приведение типов.
  • Умение объяснить, когда и зачем использовать symbol или bigint.

Типичные ошибки

  • Забывают про bigint и symbol, называют только 5 типов.
  • Утверждают, что null - это объект, не упоминая историческую причину.
  • Путают примитивы с их объектными обёртками (например, new String("x") - это объект, а не примитив).
  • Считают, что примитивы имеют методы - не понимают механизм autoboxing.
  • Используют == для сравнения с null и undefined, не зная, что null == undefined даёт true.

> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?

Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью