Типы данных JavaScript
Изучите восемь типов данных JavaScript — number, string, boolean, null, undefined, bigint, symbol и object — с оператором typeof, правилами приведения типов и примерами.
Введение в типы данных JavaScript
JavaScript — это язык с динамической типизацией: вы никогда не объявляете тип переменной, и переменная может хранить значение любого типа — и даже другого типа позднее. Поскольку именно движок, а не вы, отслеживает типы во время выполнения, точное понимание поведения каждого типа отличает предсказуемый код от загадочных ошибок.
let x = 42; // x is now a number
x = "forty-two"; // the same variable now holds a string — perfectly legalЯзык определяет восемь типов данных: семь примитивов и один непримитивный (object). На этой странице рассматривается каждый из них, способ проверки типа с помощью typeof и правила приведения типов, которые чаще всего ставят новичков в тупик.
Примитивные типы данных
Примитив — это значение, которое не является object и не имеет собственных методов. Примитивы неизменяемы — вы никогда не можете изменить само примитивное значение, только заменить переменную, которая его содержит.
- Number: Целые или числа с плавающей точкой, а также специальные значения
Infinity,-InfinityиNaN(не число). См. Numbers. - String: Текстовые данные, заключённые в двойные кавычки, одинарные кавычки или обратные апострофы. См. Strings.
- Boolean: Одно из двух логических значений:
trueилиfalse. - Undefined: Переменная, которая была объявлена, но которой не присвоено значение.
- Null: Намеренное отсутствие какого-либо значения object.
- BigInt: Целые числа, превышающие безопасный предел типа Number. См. BigInt.
- Symbol: Гарантированно уникальный идентификатор, используемый преимущественно в качестве ключей object. См. Symbol type.
Непримитивный тип данных
- Object: Коллекция свойств в виде пар ключ/значение, используемая для моделирования сложных данных. Массивы, функции, даты и большинство встроенных сущностей — это object под капотом. См. Objects.
Проверка типа с помощью typeof
Чтобы узнать тип значения, JavaScript предоставляет оператор typeof. Он возвращает string вида "number", "string" или "boolean".
Два результата удивляют новичков:
typeof nullвозвращает"object". Это ошибка, существующая с самой первой версии JavaScript, которую невозможно исправить без поломки веба — просто запомните её.typeofфункции возвращает"function". Функции в действительности являются object, ноtypeofобрабатывает их особым образом, чтобы вы могли обнаруживать вызываемые значения.
Работа с примитивными типами данных
Ниже каждый примитив показан с минимальным примером, который можно запустить.
Number: основа математических операций
let age = 25; // Integer
let price = 99.99; // Floating-point
console.log(typeof age); // "number"
console.log(0.1 + 0.2); // 0.30000000000000004 (floating-point rounding)Единственный тип number охватывает как целые числа, так и десятичные. Поскольку числа используют 64-битную плавающую точку, дробная математика не всегда точна — 0.1 + 0.2 является классическим примером. Числа также включают Infinity и NaN; NaN печально известен тем, что не равен самому себе, поэтому для его проверки используйте Number.isNaN(x).
String: больше, чем просто текст
let greeting = "Hello, world!";
let name = 'Ada';
let response = `Hi, ${name}!`; // template literal with interpolation
console.log(typeof greeting); // "string"
console.log(response); // "Hi, Ada!"Строки (string) неизменяемы: методы вроде toUpperCase() возвращают новую string, не изменяя исходную. Строки в обратных апострофах (шаблонные литералы) позволяют встраивать ${выражения} и занимать несколько строк. Полный набор инструментов — в разделе Strings.
Boolean: принятие бинарных решений
let isAvailable = true;
let age = 25;
let isAdult = age >= 18; // comparisons produce booleans
console.log(typeof isAvailable); // "boolean"
console.log(isAdult); // trueBoolean управляет каждым условием и циклом. Любое значение также может быть приведено к boolean — смотрите таблицу истинных и ложных значений ниже.
Undefined и Null: отсутствие значения
let notAssigned; // declared but never given a value
let emptyOnPurpose = null; // deliberately "nothing"
console.log(typeof notAssigned); // "undefined"
console.log(typeof emptyOnPurpose); // "object" (the typeof null quirk)
console.log(null == undefined); // true (loose equality)
console.log(null === undefined); // false (strict equality — different types)Используйте undefined для обозначения «значения ещё нет» (именно это JavaScript присваивает автоматически), а null — для «намеренно пусто». Они равны при нестрогом сравнении (==), но не равны при строгом (===).
BigInt: работа с большими числами
const big = 9007199254740991n; // note the trailing n
console.log(typeof big); // "bigint"
console.log(big + 1n); // 9007199254740992nNumber может безопасно представлять целые числа только до Number.MAX_SAFE_INTEGER (около 9 квадриллионов). Для значений больше этого предела — криптография, высокоточные идентификаторы — используйте BigInt, записываемый с суффиксом n. Нельзя смешивать BigInt и Number в одном арифметическом выражении без явного преобразования. Подробнее — в разделе BigInt.
Symbol: обеспечение уникальности
Каждый вызов Symbol() возвращает абсолютно новое, уникальное значение, даже если текст описания совпадает. Символы используются как защищённые от коллизий ключи object, например для добавления метаданных без конфликтов с обычными string-ключами. См. Symbol type.
Objects: строительные блоки сложных структур
В JavaScript objects хранят коллекции связанных данных в виде пар ключ/значение и являются основой для array, функций и большинства встроенных сущностей.
let person = {
name: "John",
age: 30,
isStudent: false
};
console.log(typeof person); // "object"
console.log(typeof [1, 2, 3]); // "object" (arrays are objects)
console.log(Array.isArray([1])); // true — the reliable way to detect arraysObjects изменяемы — в отличие от примитивов, вы можете добавлять, изменять и удалять их свойства. Они также сравниваются по ссылке, а не по значению: два object с идентичным содержимым не будут равны через ===.
Приведение и преобразование типов
Поскольку JavaScript является языком с динамической типизацией, он часто приводит значение одного типа к другому в ходе операции. Это удобно, но является распространённым источником неожиданностей.
В случае сомнений выполняйте преобразование явно с помощью Number(), String() или Boolean(), вместо того чтобы полагаться на автоматическое приведение типов.
Истинные и ложные значения
Когда значение используется там, где ожидается boolean (в if, &&, ||), оно приводится к нему. Ровно шесть значений являются ложными (falsy); всё остальное — истинное (truthy):
// falsy: false, 0, "", null, undefined, NaN
if ("") console.log("won't run"); // "" is falsy
if ("0") console.log("this runs"); // non-empty string is truthy
if ([]) console.log("this runs too"); // empty array is truthy!Частая ловушка: пустой array [] и пустой object {} являются истинными (truthy), хотя "" и 0 ложные.
Итоги
В JavaScript восемь типов данных — семь примитивов (number, string, boolean, undefined, null, bigint, symbol) и object. typeof сообщает тип с известными особенностями: typeof null возвращает "object", а функции возвращают "function". Примитивы неизменяемы и сравниваются по значению; object изменяемы и сравниваются по ссылке. Освойте приведение типов и правила truthy/falsy, и большинство «странностей JavaScript» исчезнет. Далее узнайте, как значения хранятся в разделе Variables.