> Сколько типов данных в JavaScript и какие они (JavaScript)

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

Компании: Иннотех, YADRO, Garage Eight, циан, ЛитРес, VK, Инити, Aston, Домклик, IT-One, EdenAI, Purrweb, SmartWay, ООО Снэп АйТи

Стек: JavaScript

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

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

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

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

Все типы делятся на две категории: примитивные и ссылочные.

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

  • string - строки, иммутабельны, хранятся как UTF-16
  • number - числа с плавающей точкой (double precision), включая NaN, Infinity, -Infinity
  • boolean - true/false
  • null - явное отсутствие значения, typeof возвращает "object"
  • undefined - значение не присвоено
  • symbol - уникальные идентификаторы, создаются через Symbol()
  • bigint - целые числа произвольной точности, создаются через BigInt() или суффикс n

Ссылочный тип:

  • object - включает массивы, функции, даты, регулярные выражения и все остальные сложные структуры

Ключевое отличие: примитивы сравниваются по значению, объекты - по ссылке. При присваивании примитива копируется значение, при присваивании объекта - копируется ссылка на один и тот же объект в памяти.

На практике

Для senior-позиции важно понимать не просто список типов, а их поведение в рантайме:

  • Автоупаковка примитивов: при вызове метода на примитиве (например, "text".toUpperCase()) JS временно оборачивает его в объект-обёртку
  • Разница между == и === при сравнении примитивов и объектов
  • Особенности работы с bigint: нельзя смешивать с number в арифметических операциях без явного преобразования
  • Symbol как ключ объекта не перечисляется в for...in и не попадает в Object.keys(), но доступен через Object.getOwnPropertySymbols()
  • Проверка типа через typeof работает корректно для всех примитивов, кроме null, и для функций возвращает "function"

Пример кода

JAVASCRIPT
// Примитивы
const str = "hello";
const num = 42;
const bool = true;
const n = null;
let undef;
const sym = Symbol("id");
const big = 9007199254740993n;
// Объект
const obj = { name: "test" };
// Проверка типов
console.log(typeof str); // "string"
console.log(typeof num); // "number"
console.log(typeof bool); // "boolean"
console.log(typeof n); // "object" - историческая ошибка
console.log(typeof undef); // "undefined"
console.log(typeof sym); // "symbol"
console.log(typeof big); // "bigint"
console.log(typeof obj); // "object"
// Примитивы по значению
let a = 10;
let b = a;
b = 20;
console.log(a); // 10 - значение не изменилось
// Объекты по ссылке
const arr1 = [1, 2, 3];
const arr2 = arr1;
arr2.push(4);
console.log(arr1); // [1, 2, 3, 4] - изменился и arr1
// Автоупаковка
const text = "abc";
console.log(text.length); // 3 - временная обёртка

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

Начните с чёткого перечисления всех 8 типов и разделения на примитивные и ссылочные. Затем добавьте глубину: упомяните автоупаковку, поведение typeof для null, разницу между значением и ссылкой. Для senior-уровня стоит показать понимание внутренних механизмов: как V8 хранит примитивы (tagged pointers, NaN-boxing), почему bigint медленнее number, и какие проблемы возникают при сравнении объектов.

Хорошая структура ответа: список типов → классификация → ключевые отличия → практические нюансы. Не останавливайтесь на простом перечислении, покажите, что понимаете последствия для производительности и корректности кода.

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

Интервьюер оценивает:

  • Базовое знание спецификации ECMAScript
  • Понимание разницы между примитивами и объектами
  • Знание edge cases (typeof null, автоупаковка, сравнение объектов)
  • Умение объяснять сложные концепции простыми словами
  • Глубину понимания для senior: как типы влияют на память, производительность, поведение в рантайме

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

  • Забывают про bigint или symbol - это самые часто пропускаемые типы
  • Утверждают, что typeof null возвращает "null" - это неверно
  • Путают undefined и null: undefined - отсутствие значения, null - явное указание пустоты
  • Не упоминают, что функции и массивы - это подтипы object
  • Говорят, что в JS есть "integer" тип - это не так, number всегда double
  • Не знают про автоупаковку примитивов при вызове методов
  • Смешивают понятия "тип данных" и "структура данных" (например, называют массив отдельным типом)

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

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