Отличие примитивов от непримитивов в 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
Непримитивные типы (объекты)
Все остальные типы — это объекты, включая:
Object
Array
Function
Date
И даже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"
— это не ошибка в вашем коде, а исторический баг языка.