JavaScript: Примитивные и ссылочные типы данных

В JavaScript важно понимать разницу между примитивными и ссылочными типами данных.

Переменные

Переменная – это строительный блок любого языка программирования. Она может изменять своё значение. Цель переменной – хранить значение, которое можно использовать многократно. Переназначение переменной – это присвоение ей нового значения. Изменение значения переменной означает изменение самой переменной. Само значение – это запись в памяти, имеющая определённый тип. Все типы значений в JavaScript делятся на две группы: примитивные и ссылочные. Различие обусловлено способом хранения значений в памяти.

Примитивные типы данных

В JavaScript существует шесть примитивных типов данных:

  • string (строка) – например, «Hello world»
  • boolean (булево) – true или false
  • number (число) – 0, -5, 7, 5.2, 10.7 и т.д.
  • null (нулевое) – ничего
  • undefined (неопределённое) – неопределённое значение
  • symbol (символ) – например, Symbol.iterator (введён в ECMAScript 2015).

Ссылочные типы данных

В JavaScript существует только один ссылочный тип данных: object. Массивы и функции в JavaScript – это объекты. Практически всё в JavaScript – это объект.

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

Примитивные типы хранятся в памяти в отдельных ячейках. Например, строка «Hello world» хранится как последовательность нулей и единиц в отдельной области памяти. Значения можно читать и перезаписывать в новые области памяти. То же самое справедливо для boolean и number.

В случае ссылочных типов, значения хранятся не напрямую, а в двух местах:

  1. Указатель (pointer): Хранит местоположение объекта в памяти.
  2. Область памяти: Здесь хранится само значение объекта.

Разные указатели могут указывать на одно и то же место в памяти, где хранится значение ссылочного типа. Изменение значения ссылочного типа изменяет его в единственном месте в памяти; все указатели по-прежнему указывают на это обновлённое место.

Пример работы со ссылочными типами

Рассмотрим пример:

let a = { a: 10, b: 20 };
let copyOfA = a;
copyOfA.a = 20;
console.log(a.a); // Выведет 20

Переменная a хранит указатель на объект. copyOfA – это копия указателя, а не самого объекта. Изменение свойства a в copyOfA изменяет объект в памяти, и это изменение отразится при доступе к свойству a через переменную a.

Резюме

  • В JavaScript только один ссылочный тип – object.
  • Значения ссылочного типа хранятся в памяти вместе с указателями.
  • Практически всё в JavaScript является объектом.

Что будем искать? Например,программа