Отличие примитивов от непримитивов в JavaScript
Что такое примитивы и непримитивы?
В JavaScript все данные делятся на два типа:
- Примитивные типы (Primitive Types) — это значения, которые не являются объектами и имеют неизменяемое (immutable) значение.
- Непримитивные типы (Reference Types) — это объекты, которые хранятся и передаются по ссылке, могут быть изменяемыми.
Примитивные типы
Примитивы — это основные типы, встроенные в язык.
| Тип | Пример | Особенности |
|---|---|---|
string | "Hello" | Текстовая строка |
number | 42, 3.14 | Любое число (целое и с плавающей точкой) |
boolean | true, false | Истина или ложь |
null | null | Намеренное отсутствие значения |
undefined | undefined | Значение не было присвоено |
bigint | 900719925...n | Большие числа |
symbol | Symbol('id') | Уникальные идентификаторы |
Особенности примитивов
- Передаются по значению
- Неизменяемы
- Сравниваются по значению
let a = 10;
let b = a;
b = 20;
console.log(a); // 10
Непримитивные типы (объекты)
Все остальные типы — это объекты, включая:
ObjectArrayFunctionDateИ дажеnullсчитается объектом поtypeof, но это баг языка
Особенности объектов
- Хранятся и передаются по ссылке
- Могут быть изменяемыми
- Сравниваются по ссылке, даже если значения одинаковые
const obj1 = { name: "Alice" };
const obj2 = obj1;
obj2.name = "Bob";
console.log(obj1.name); // "Bob" — потому что obj1 и obj2 ссылаются на один и тот же объект
Сравнение поведения
| Примитивы | Объекты |
|---|---|
| Передаются по значению | Передаются по ссылке |
| Сравниваются по значению | Сравниваются по ссылке |
| Неизменяемы | Изменяемы |
typeof возвращает тип | typeof почти всегда "object" |
typeof поведение
typeof "Hello" // "string"
typeof 42 // "number"
typeof undefined // "undefined"
typeof null // "object" (известный баг)
typeof {} // "object"
typeof [] // "object"
typeof function(){} // "function"
Важный момент:
Массивы, функции и даже null — это объекты в JavaScript. Поэтому typeof null === "object" — это не ошибка в вашем коде, а исторический баг языка.