Skip to content

Latest commit

 

History

History
81 lines (57 loc) · 4.12 KB

File metadata and controls

81 lines (57 loc) · 4.12 KB

Примитивы

В JavaScript переменные динамически типизированы, то есть их тип определяется присваиваемым значением.

Существует семь простых (примитивных) типов данных:

  • string
  • number
  • bigint (новое в ECMAScript 2015)
  • boolean
  • symbol
  • undefined
  • null

Все примитивы неизменяемы (immutable), то есть они не могут быть изменены. Важно не путать сам примитив с переменной, которой присвоено значение примитивного типа.

Переменной может быть переприсвоено новое значение, но существующее значение примитивного типа не может быть изменено подобно объектам, массивам и функциям.

Объекты-обёртки

В JavaScript, за исключением null и undefined, все примитивные типы данных имеют соответствующие объекты-обёртки (wrapper objects), которые предоставляют методы для работы с этими примитивами.

Примитивный тип Объект-обёртка
string String
number Number
boolean Boolean
bigint BigInt
symbol Symbol
null Нет обёртки
undefined Нет обёртки

Метод valueOf() типа обёртки возвращает значение примитивного типа.

Как это работает?

Когда вы пытаетесь вызвать метод у примитива (например, 'hello'.toUpperCase()), JavaScript автоматически оборачивает примитив в соответствующий объект, вызывает метод, а затем возвращает примитивное значение обратно.

Пример:

const str = 'hello'; // примитив string
console.log(str.toUpperCase()); // "HELLO" - временно обёрнут в String

Эквивалентно:

const str = 'hello';
const tempObj = new String(str); // временная обёртка
console.log(tempObj.toUpperCase()); // метод вызывается у объекта
// после выполнения объект удаляется

Особенности:

  1. null и undefined не имеют методов Попытка вызвать метод у них приведёт к ошибке:

    null.toString(); // TypeError: Cannot read property 'toString' of null
    undefined.toString(); // TypeError: Cannot read property 'toString' of undefined
  2. Объекты-обёртки — это не то же самое, что примитивы

    const a = 5; // примитив number
    const b = new Number(5); // объект Number
    
    console.log(typeof a); // "number"
    console.log(typeof b); // "object"
    
    console.log(a === b); // false (примитив !== объекту)
  3. Использование обёрток вручную обычно избыточно В большинстве случаев лучше работать с примитивами, а не создавать объекты вручную (new String, new Number и т. д.), так как это может привести к неочевидному поведению.

Объекты-обёртки существуют, чтобы предоставить методы для работы с примитивами, но JavaScript автоматически использует их "под капотом", поэтому явное создание таких объектов требуется крайне редко.