Различия между простыми и сложными типами данных в JavaScript

от автора

в
Время чтения: 1 мин.

Введение

JavaScript, как и многие другие языки программирования, имеет два основных вида типов данных: примитивные (простые) и ссылочные (сложные). Понимание различий между ними крайне важно для эффективной работы с языком, так как это влияет на то, как значения хранятся в памяти, как передаются между переменными и как ведут себя при операциях сравнения.

1. Примитивные (простые) типы данных

1.1. Что относится к примитивным типам?

В JavaScript существует 7 примитивных типов:

  1. number (числа)
  2. string (строки)
  3. boolean (логические значения: true/false)
  4. null (специальное значение)
  5. undefined (неопределенное значение)
  6. symbol (уникальные идентификаторы, с ES6)
  7. bigint (большие целые числа, с ES11)

1.2. Особенности примитивных типов

  • Хранятся в стеке (stack) — области памяти с быстрым доступом
  • Имеют фиксированный размер в памяти
  • Неизменяемы (immutable) — любые операции создают новое значение
  • Передаются по значению — при присваивании или передаче в функцию создается копия
  • Сравниваются по значению
let a = 10;
let b = a; // Создается копия значения
b = 20;
console.log(a); // 10 (оригинал не изменился)

2. Ссылочные (сложные) типы данных

2.1. Что относится к ссылочным типам?

Все, что не является примитивом, включая:

  1. Object (объекты)
  2. Array (массивы)
  3. Function (функции)
  4. Date (даты)
  5. Map, Set (с ES6)
  6. И другие не-примитивные структуры

2.2. Особенности ссылочных типов

  • Хранятся в куче (heap) — динамической области памяти
  • Имеют переменный размер
  • Изменяемы (mutable) — можно изменять содержимое
  • Передаются по ссылке — переменная содержит адрес объекта в памяти
  • Сравниваются по ссылке, а не по содержимому
let obj1 = { name: "John" };
let obj2 = obj1; // Копируется ссылка на объект
obj2.name = "Alice";
console.log(obj1.name); // "Alice" (изменился оригинальный объект)

3. Ключевые различия

ХарактеристикаПримитивные типыСсылочные типы
ХранениеВ стекеВ куче
РазмерФиксированныйДинамический
ИзменяемостьНеизменяемыИзменяемы
ПередачаПо значению (копия)По ссылке
СравнениеПо значениюПо ссылке
Примерыnumber, string, booleanObject, Array, Function

4. Практические примеры различий

4.1. Передача в функции

Примитивы передаются по значению:

function changePrimitive(val) {
  val = 100;
}

let num = 50;
changePrimitive(num);
console.log(num); // 50 (не изменился)

Ссылочные типы передаются по ссылке:

function changeReference(obj) {
  obj.value = "changed";
}

let myObj = { value: "original" };
changeReference(myObj);
console.log(myObj.value); // "changed" (объект изменился)

4.2. Сравнение значений

Примитивы сравниваются по значению:

let a = "hello";
let b = "hello";
console.log(a === b); // true

Ссылочные типы сравниваются по ссылке:

let obj1 = { id: 1 };
let obj2 = { id: 1 };
console.log(obj1 === obj2); // false (разные объекты в памяти)

5. Особенности работы со ссылочными типами

5.1. Создание копий объектов

Для работы с независимыми копиями объектов нужно создавать их явно:

Поверхностное копирование:

let original = { a: 1, b: 2 };
let copy = Object.assign({}, original);
// Или с использованием spread оператора
let copy2 = { ...original };

Глубокое копирование:

let deepCopy = JSON.parse(JSON.stringify(original));

5.2. Проверка типов

Из-за особенностей JavaScript проверка типов требует внимания:

typeof "text" // "string"
typeof 42     // "number"
typeof true   // "boolean"
typeof {}     // "object"
typeof []     // "object" (массив тоже объект)
typeof null   // "object" (историческая ошибка)

// Для точной проверки массивов:
Array.isArray([]) // true

// Проверка на null:
value === null

Заключение

Понимание различий между простыми и сложными типами в JavaScript — фундаментальный аспект языка, который влияет на:

  1. Как значения хранятся и передаются
  2. Как они ведут себя при операциях присваивания
  3. Как работают сравнения
  4. Как изменяются данные в программе

Освоив эти концепции, вы сможете избежать множества распространенных ошибок и писать более надежный и предсказуемый код на JavaScript.


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Сколько будет 7 + 6?