--- title: Primitive slug: Glossary/Primitive tags: - CodingScripting - Glossary - JavaScript translation_of: Glossary/Primitive original_slug: Глоссарий/Primitive ---
Примитив (значение примитивного типа, примитивный тип данных) это данные, которые не являются {{glossary("object", "объектом")}} и не имеют {{glossary("method","методов")}}. В {{Glossary("JavaScript")}} 7 простых типов данных: {{Glossary("string")}}, {{Glossary("number")}}, {{Glossary("boolean")}}, {{Glossary("null")}}, {{Glossary("undefined")}}, {{Glossary("symbol")}} (новое в {{Glossary("ECMAScript")}} 2015), {{Glossary("bigint")}}.
Чаще всего значение примитивного типа представлено в низкоуровневой реализации языка.
Все примитивы неизменяемы (immutable), то есть они не могут быть изменены. Важно не путать сам примитив с переменной, которой присвоено значение примитивного типа. Переменной может быть переприсвоено новое значение, но существующее значение примитивного типа не может быть изменено подобно объектам, массивам и функциям.
Этот пример поможет понять, что значения примитивных типов неизменяемы (immutable).
// Using a string method doesn't mutate the string var bar = "baz"; console.log(bar); // baz bar.toUpperCase(); console.log(bar); // baz // Using an array method mutates the array var foo = []; console.log(foo); // [] foo.push("plugh"); console.log(foo); // ["plugh"] // Assignment gives the primitive a new (not a mutated) value bar = bar.toUpperCase(); // BAZ
Примитив может быть заменён, но он не может быть напрямую изменён.
Следующий пример поможет разобраться как JavaScript работает с примитивами.
// The Primitive let foo = 5; // Defining a function that should change the Primitive value function addTwo(num) { num += 2; } // Another function trying to do the same thing function addTwo_v2(foo) { foo += 2; } // Calling our first function while passing our Primitive as an argument addTwo(foo); // Getting the current Primitive value console.log(foo); // 5 // Trying again with our second function... addTwo_v2(foo); console.log(foo); // 5
Вы ожидали, что будет 7 вместо 5? Если так, тогда прочитайте, как работает этот код:
addTwo
и addTwo_v2
, JavaScript ищет значение для идентификатора foo
. JavaScript правильно определяет нашу переменную, созданную с помощью первого оператораnum
для addTwo
, foo для addTwo_v2
)num
. Мы увеличиваем его значение на 2 (а не значение исходной переменной foo
). foo
. Мы увеличиваем его значение на 2 (а не значение исходной (внешней) переменной foo
). Кроме того, в этой ситуации, внешняя переменная foo
является недоступной никаким способом. Это связано с лексическими областями JavaScript и, как следствие, с затенением переменных. Локальная переменная foo
скрывает внешнюю переменную foo
. Чтобы получить больше информации, смотри Closures.foo
вообще, так как мы работаем с её копиямиВот почему примитивы неизменяемы (immutable). Потому что мы не работаем над ними напрямую. Мы создаём копию и продолжаем работать с ней, не касаясь исходных значений.
За исключением null
и undefined
, все примитивные значения имеют объектный аналог, который оборачивает значение примитивного типа:
Метод valueOf()
типа обёртки возвращает значение примитивного типа.