Hack Frontend Community

Отличие примитивов от непримитивов в JavaScript

Что такое примитивы и непримитивы?

В JavaScript все данные делятся на два типа:

  • Примитивные типы (Primitive Types) — это значения, которые не являются объектами и имеют неизменяемое (immutable) значение.
  • Непримитивные типы (Reference Types) — это объекты, которые хранятся и передаются по ссылке, могут быть изменяемыми.

Примитивные типы

Примитивы — это основные типы, встроенные в язык.

ТипПримерОсобенности
string"Hello"Текстовая строка
number42, 3.14Любое число (целое и с плавающей точкой)
booleantrue, falseИстина или ложь
nullnullНамеренное отсутствие значения
undefinedundefinedЗначение не было присвоено
bigint900719925...nБольшие числа
symbolSymbol('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" — это не ошибка в вашем коде, а исторический баг языка.