Чем отличаются типы данных в JavaScript и как это влияет на код?
Основы языка
Типы данных в JavaScript делятся на примитивные и ссылочные. Они различаются тем, как хранятся и передаются: примитивы по значению, объекты по ссылке.
Примитивы (передаются по значению)
- string — строка.
- number — число, включая
NaNиInfinity. - bigint — большие целые.
- boolean —
true/false. - undefined — переменная объявлена, но не инициализирована.
- symbol — уникальный идентификатор.
- null — намеренное отсутствие значения (
typeof null === 'object'— историческая ошибка).
Примитивы иммутабельны: методы строк возвращают новую строку, а не меняют исходную.
Ссылочные типы (передаются по ссылке)
- object — объекты, массивы, функции,
Date,RegExpи т. д.
Переменная хранит не сам объект, а ссылку на него в куче.
Как это влияет на код
let a = 10;
let b = a;
b = 20;
console.log(a); // 10 — копия значения
let obj1 = { x: 1 };
let obj2 = obj1;
obj2.x = 99;
console.log(obj1.x); // 99 — одна ссылка на объектПоэтому объекты нужно копировать (spread, structuredClone) перед изменением, если исходник менять нельзя.
Проверка типов
typeof— для примитивов (кромеnull).Array.isArray()— для массивов.Object.prototype.toString.call(x)— универсальный способ.
Коротко для собеседования
7 примитивов (string, number, bigint, boolean, undefined, symbol, null) передаются по значению и иммутабельны; объекты — по ссылке. Из-за этого мутация общего объекта видна во всех переменных, ссылающихся на него.