Система типов
В JavaScript всего два больших семейства значений — примитивы и объекты, и почти все ловушки типов растут из разницы между ними. Примитивов семь (string, number, boolean, null, undefined, bigint, symbol): они неизменяемы и копируются по значению. Всё остальное — объекты: они изменяемы и копируются по ссылке. Это различие объясняет, почему const-объекту можно менять свойства, почему мутация видна через две переменные, а переприсваивание — нет.
Поверх этого лежат тонкости: typeof null возвращает 'object' (давняя ошибка языка), NaN не равен сам себе, а у примитива вдруг есть методы — потому что движок на миг оборачивает его в объект. Каждый слой ниже разбирает один такой механизм.
Карта темы
- Примитивные типы — семь примитивов, что делает значение примитивом и чем оно отличается от объекта.
- Оператор typeof — какие строки возвращает
typeofи почему дляnullэто'object'. - null против undefined — «не присвоено» против явного «нет значения» и как они ведут себя при сравнении и приведении.
- Значение против ссылки — почему примитивы копируются, а объекты разделяются, и что такое «передача по разделению».
- Объекты-обёртки — как примитив получает методы через временную обёртку
String/Number/Boolean. - NaN — что это за значение, почему оно не равно себе и как проверять его через
Number.isNaN. - Неизменяемость — неизменяемость примитивов, что на деле защищает
constи рольObject.freeze.
Частые ошибки и ловушки
| Ошибка | Последствие |
|---|---|
Считать null объектом из-за typeof null | Неверная проверка типа — это давний баг языка, а не тип |
Проверять NaN через x === NaN | Всегда false — NaN не равен самому себе |
Использовать глобальный isNaN вместо Number.isNaN | Ложные срабатывания — глобальный приводит аргумент к числу |
Думать, что const делает объект неизменяемым | const запрещает лишь перепривязку, свойства меняются |
| Ждать, что изменение объекта в функции не видно снаружи | Ссылка общая — мутация видна всем держателям |
Обратиться к свойству null/undefined | TypeError — у них нет объекта-обёртки |
Значение для собеседований
Систему типов спрашивают, чтобы отсеять кандидата, который знает синтаксис, но не понимает модель значений. Ответ «null — это когда переменной ничего не присвоили» уже проигрывает: это как раз undefined. Сильный ответ разводит два семейства (примитив/объект) и объясняет поведение через них.
Что обычно проверяют:
- Сколько примитивов и что делает значение примитивом.
- Разницу
nullиundefinedпоtypeof, сравнению и приведению. - Значение против ссылки — что мутируется, а что копируется.
- Почему
NaN !== NaNи как его проверить; что защищаетconst.
Типичный неверный ответ: «const делает значение неизменяемым». На деле const запрещает лишь перепривязку имени; свойства const-объекта спокойно меняются, а поверхностную заморозку даёт Object.freeze.