В JavaScript переменные динамически типизированы, то есть их тип определяется присваиваемым значением.
Существует семь простых (примитивных) типов данных:
stringnumberbigint(новое в ECMAScript 2015)booleansymbolundefinednull
Все примитивы неизменяемы (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()); // метод вызывается у объекта
// после выполнения объект удаляется-
nullиundefinedне имеют методов Попытка вызвать метод у них приведёт к ошибке:null.toString(); // TypeError: Cannot read property 'toString' of null undefined.toString(); // TypeError: Cannot read property 'toString' of undefined
-
Объекты-обёртки — это не то же самое, что примитивы
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 (примитив !== объекту)
-
Использование обёрток вручную обычно избыточно В большинстве случаев лучше работать с примитивами, а не создавать объекты вручную (
new String,new Numberи т. д.), так как это может привести к неочевидному поведению.
Объекты-обёртки существуют, чтобы предоставить методы для работы с примитивами, но JavaScript автоматически использует их "под капотом", поэтому явное создание таких объектов требуется крайне редко.