> Сколько типов данных в 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
- Не знают про автоупаковку примитивов при вызове методов
- Смешивают понятия "тип данных" и "структура данных" (например, называют массив отдельным типом)
> Похожие задачи по frontend
Что такое Map и Set в JavaScript
Что такое this в JavaScript и как он работает в объектах и функциях?
Что такое всплытие (hoisting) в JavaScript?
Что такое промисы в JavaScript и как они работают
> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?
Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью