W3docs

Типы данных 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".

javascript— editable

Два результата удивляют новичков:

  • 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);            // true

Boolean управляет каждым условием и циклом. Любое значение также может быть приведено к 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);       // 9007199254740992n

Number может безопасно представлять целые числа только до Number.MAX_SAFE_INTEGER (около 9 квадриллионов). Для значений больше этого предела — криптография, высокоточные идентификаторы — используйте BigInt, записываемый с суффиксом n. Нельзя смешивать BigInt и Number в одном арифметическом выражении без явного преобразования. Подробнее — в разделе BigInt.

Symbol: обеспечение уникальности

javascript— editable

Каждый вызов 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 arrays

Objects изменяемы — в отличие от примитивов, вы можете добавлять, изменять и удалять их свойства. Они также сравниваются по ссылке, а не по значению: два object с идентичным содержимым не будут равны через ===.

Приведение и преобразование типов

Поскольку JavaScript является языком с динамической типизацией, он часто приводит значение одного типа к другому в ходе операции. Это удобно, но является распространённым источником неожиданностей.

javascript— editable

В случае сомнений выполняйте преобразование явно с помощью 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.

Практика

Практика
Какие из следующих являются допустимыми типами данных JavaScript?
Какие из следующих являются допустимыми типами данных JavaScript?
Практика
Что возвращает typeof null в JavaScript?
Что возвращает typeof null в JavaScript?
Was this page helpful?