← Назад к вопросам

Как хранится примитив в переменной?

1.8 Middle🔥 171 комментариев
#JavaScript Core

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI4 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Хранение примитивов в переменных JavaScript

В JavaScript примитивные значения хранятся в переменных прямо в области памяти, выделенной для этой переменной, в отличие от объектов, которые хранятся по ссылке. Это фундаментальное различие между примитивными типами и ссылочными типами.

Механизм хранения примитивов

Когда вы объявляете переменную с примитивным значением:

let number = 42;
let text = "Hello";
let flag = true;

В памяти происходит следующее:

  1. Выделяется ячейка памяти для переменной
  2. Значение примитива записывается непосредственно в эту ячейку
  3. Размер ячейки фиксирован и зависит от типа примитива

Типы примитивов в JavaScript

JavaScript имеет 7 примитивных типов данных:

  • number - целые и дробные числа, Infinity, NaN
  • string - строки текста
  • boolean - true или false
  • undefined - неопределенное значение
  • null - отсутствие значения
  • symbol - уникальные идентификаторы (ES6+)
  • bigint - большие целые числа (ES2020+)

Особенности работы с примитивами

1. Копирование по значению

При копировании переменной с примитивом создается полная копия значения:

let a = 10;
let b = a; // Копируется значение 10

b = 20;
console.log(a); // 10 (оригинал не изменился)
console.log(b); // 20

2. Неизменяемость (Immutability)

Примитивы являются неизменяемыми (immutable). Любая операция, которая "изменяет" примитив, на самом деле создает новое значение:

let str = "hello";
str.toUpperCase(); // Создается НОВАЯ строка "HELLO"
console.log(str); // "hello" (оригинал не изменился)

str = str.toUpperCase(); // Теперь str ссылается на новую строку
console.log(str); // "HELLO"

3. Сравнение по значению

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

let x = 5;
let y = 5;
console.log(x === y); // true (значения одинаковы)

let str1 = "text";
let str2 = "text";
console.log(str1 === str2); // true

Внутреннее представление в движках JavaScript

Современные движки (V8, SpiderMonkey, JavaScriptCore) оптимизируют хранение примитивов:

  • Небольшие числа часто хранятся в формате Smi (Small Integer) для оптимизации
  • Строки могут использовать различные представления:
    • Latin-1 для строк с символами из диапазона 0-255
    • UTF-16 для строк с Unicode-символами
    • Cons string для конкатенированных строк
// Движок может оптимизировать хранение
const smallNumber = 42; // Может храниться как Smi
const largeNumber = 9999999999; // Хранится как полноценный Number

Особые случаи и нюансы

Обертки для примитивов

JavaScript автоматически оборачивает примитивы в объекты при необходимости:

let str = "hello";
console.log(str.length); // 5
// Автоматическое создание временного String-объекта:
// new String(str).length

Особенности null и undefined

  • undefined - переменная объявлена, но значение не присвоено
  • null - явное указание на отсутствие значения
let a; // undefined (по умолчанию)
let b = null; // Явное "пустое" значение

Символы (Symbol) - уникальные примитивы

Каждый символ уникален, даже с одинаковым описанием:

let sym1 = Symbol("id");
let sym2 = Symbol("id");
console.log(sym1 === sym2); // false (всегда уникальны)

Практические последствия

Понимание хранения примитивов важно для:

  • Оптимизации производительности - примитивы работают быстрее объектов
  • Предсказуемости кода - отсутствие побочных эффектов при копировании
  • Отладки - значения примитивов отображаются непосредственно
  • Работы с функциями - примитивы передаются в функции по значению:
function changeValue(x) {
    x = 100; // Изменяется локальная копия
}

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

Ключевой вывод: Примитивы в JavaScript хранятся непосредственно в переменных по значению, являются неизменяемыми, сравниваются по значению и копируются полностью при присваивании. Это делает работу с ними предсказуемой и эффективной, в отличие от объектов, которые хранятся по ссылке.