This page was translated from English by the community.Learn more and join the MDN Web Docs community.
Primitive
Примитив (значение примитивного типа, примитивный тип данных) это данные, которые не являютсяобъектом и не имеютметодов. ВJavaScript 7 простых типов данных:string,number,boolean,null,undefined,symbol (новое вECMAScript 2015),bigint.
Чаще всего значение примитивного типа представлено в низкоуровневой реализации языка.
Всепримитивы неизменяемы (immutable), то есть они не могут быть изменены. Важно не путать сам примитив с переменной, которой присвоено значение примитивного типа. Переменной может быть переприсвоено новое значение, но существующее значение примитивного типа не может быть изменено подобно объектам, массивам и функциям.
In this article
Пример
Этот пример поможет понять, что значения примитивных типов неизменяемы(immutable).
JavaScript
// Using a string method doesn't mutate the stringvar bar = "baz";console.log(bar); // bazbar.toUpperCase();console.log(bar); // baz// Using an array method mutates the arrayvar foo = [];console.log(foo); // []foo.push("plugh");console.log(foo); // ["plugh"]// Assignment gives the primitive a new (not a mutated) valuebar = bar.toUpperCase(); // BAZПримитив может быть заменён, но он не может быть напрямую изменён.
Другой пример [ Step-by-step ]
Следующий пример поможет разобраться как JavaScript работает с примитивами.
JavaScript
// The Primitivelet foo = 5;// Defining a function that should change the Primitive valuefunction addTwo(num) { num += 2;}// Another function trying to do the same thingfunction addTwo_v2(foo) { foo += 2;}// Calling our first function while passing our Primitive as an argumentaddTwo(foo);// Getting the current Primitive valueconsole.log(foo); // 5// Trying again with our second function...addTwo_v2(foo);console.log(foo); // 5Вы ожидали, что будет 7 вместо 5? Если так, тогда прочитайте, как работает этот код:
При вызове обеих функций
addTwoи addTwo_v2, JavaScript ищет значение для идентификатораfoo. JavaScript правильно определяет нашу переменную, созданную с помощью первого оператораПосле этого JavaScript передаёт найденный аргумент в функцию в качестве параметра
Перед выполнением операторов в теле функции,JavaScript берёт исходный переданный аргумент (который является примитивом) и создаёт его локальную копию. Эти копии, существующие только внутри областей функций, доступны через идентификаторы, указанные в определениях функций (
numдляaddTwo, foo дляaddTwo_v2)Затем выполняются операторы функций:
- В первой функции был создан локальный аргумент
num. Мы увеличиваем его значение на 2 (а не значение исходной переменнойfoo). - Во второй функции был создан локальный аргумент
foo. Мы увеличиваем его значение на 2 (а не значение исходной (внешней) переменнойfoo). Кроме того, в этой ситуации, внешняя переменнаяfooявляется недоступнойникаким способом. Это связано с лексическими областями JavaScript и, как следствие, с затенением переменных. Локальная переменнаяfooскрывает внешнюю переменнуюfoo. Чтобы получить больше информации, смотриClosures.
- В первой функции был создан локальный аргумент
Таким образом, никакие изменения внутри наших функцийне будут влиять на ИСХОДНУЮ
fooвообще, так как мы работаем с еёкопиями
Вот почему примитивы неизменяемы(immutable). Потому что мы не работаем над ними напрямую. Мы создаём копию и продолжаем работать с ней, не касаясь исходных значений.
Обёртки примитивных типов в JavaScript
За исключениемnull иundefined, все примитивные значения имеют объектный аналог, который оборачивает значение примитивного типа:
Stringдля string примитива.Numberдля number примитива.BigIntдля bigint примитива.Booleanдля boolean примитива.Symbolдля symbol примитива.
МетодvalueOf() типа обёртки возвращает значение примитивного типа.
Смотрите также
>Общие сведения
- Введение в типы данных JavaScript
- Примитивный тип на Wikipedia