Какие типы данных существуют в javascript


В JavaScript существует два основных класса типов данных:

  • Примитивные типы (primitive types) — неизменяемые (immutable), передаются по значению.

  • Сложные (ссылочные) типы (reference types) — объекты, передаются по ссылке.

Также JavaScript — язык с динамической типизацией, это значит, что переменная может хранить значения любого типа, и тип определяется во время выполнения.

1. Примитивные типы (Primitive Types)

Примитивные значения — это значения, не являющиеся объектами и не имеющие методов. Существует 7 примитивных типов данных:

1.1. Number

Используется для представления как целых чисел, так и чисел с плавающей точкой.

let a = 42;
let b = 3.14;
let c = -7;
let d = Infinity;
let e = NaN;
  • Infinity — специальное значение, представляющее бесконечность.

  • NaN (Not a Number) — результат некорректных числовых операций, например: 0 / 0, parseInt("abc").

JavaScript использует тип number, основанный на IEEE 754 (64-битные числа с плавающей запятой).

С 2020 года появился новый числовой тип — BigInt.

1.2. BigInt

Позволяет представлять очень большие целые числа, выходящие за пределы безопасного диапазона Number.MAX_SAFE_INTEGER.

let big = 1234567890123456789012345678901234567890n;
  • Обозначается добавлением суффикса n.

  • Не может быть использован напрямую с обычными number (например, big + 5 вызовет ошибку).

1.3. String

Строки — это последовательности символов в Юникоде. В JavaScript строки являются неизменяемыми.

let str1 = 'Привет';
let str2 = "Мир";
let str3 = \`Шаблонная строка\`;

Шаблонные строки (template literals) используют обратные кавычки и поддерживают интерполяцию:

<br/>let name = "Иван";
let greeting = \`Привет, ${name}\`;

1.4. Boolean

Представляет логические значения: true или false.

let isActive = true;
let isEmpty = false;

Часто используется в условных операциях, сравнениях, логике управления потоком.

1.5. Undefined

Тип undefined представляет значение, которое не было присвоено.

let a;
console.log(a); // undefined
  • Любая переменная, объявленная с let, var, const, но не инициализированная, имеет значение undefined.

  • Возвращается функцией, если она ничего не возвращает явно.

  • Также это значение свойств или элементов, которых не существует.

1.6. Null

Тип null представляет отсутствие значения или «ничего».

let obj = null;
  • Специальное значение, означающее «пусто» или «намеренно отсутствует».

  • typeof null возвращает "object" — это историческая ошибка в языке.

1.7. Symbol (ES6)

Используется для создания уникальных идентификаторов свойств объекта.

let sym = Symbol("description");

Символы всегда уникальны, даже если описания совпадают:

<br/>Symbol("id") === Symbol("id") // false
  • Часто используются для создания приватных свойств, скрытых от обычного перебора.

  • Также применяются в системных методах (Symbol.iterator, Symbol.toPrimitive и др.).

2. Сложные типы (Reference Types)

Сложные типы — это объекты, значения которых хранятся в памяти по ссылке. Они включают:

2.1. Object

Базовый тип для всех объектов.

let obj = {
name: "Иван",
age: 30
};
  • Ключи всегда являются строками или символами.

  • Объекты могут содержать любые значения, включая функции и другие объекты.

2.2. Array

Массивы — частный случай объектов с числовыми индексами.

let arr = \[1, 2, 3, "текст"\];
  • Массивы в JavaScript не фиксированной длины.

  • Массив имеет доступ к множеству методов (push, pop, map, filter, reduce и т.д.).

  • Массив — это объект, у которого установлено специальное свойство length.

2.3. Function

Функции в JavaScript являются объектами первого класса (можно передавать как значения, хранить в переменных и т.д.).

function greet(name) {
return \`Привет, ${name}\`;
}

Также можно создавать анонимные и стрелочные функции:

const square = x => x \* x;

Функции являются объектами с внутренними свойствами ([[Call]], [[Construct]], name, length, prototype и др.).

2.4. Date, RegExp, Map, Set и др.

JavaScript предоставляет встроенные классы, основанные на Object, но со специальным поведением:

Date — объект для работы с датой и временем.

<br/>let now = new Date();

RegExp — регулярные выражения.

<br/>let pattern = /ab+c/;

Map — коллекция ключ/значение, где ключи могут быть любого типа.

<br/>let map = new Map();
map.set("ключ", 123);

Set — коллекция уникальных значений.

<br/>let set = new Set(\[1, 2, 3\]);
  • WeakMap и WeakSet — аналоги Map и Set, но без предотвращения сборки мусора для ключей.

3. Оператор typeof

Позволяет определить тип значения на этапе выполнения:

typeof 42 // 'number'
typeof 'hello' // 'string'
typeof true // 'boolean'
typeof undefined // 'undefined'
typeof null // 'object'  известный баг
typeof Symbol() // 'symbol'
typeof {} // 'object'
typeof \[\] // 'object'
typeof function(){} // 'function'
  • typeof null возвращает 'object' — это ошибка, оставшаяся по совместимости.

  • Массивы и функции тоже возвращают 'object', хотя по сути они особые типы.

Для более точной проверки:

Array.isArray(\[\]); // true

4. Проверка типа с помощью instanceof

Оператор instanceof проверяет, принадлежит ли объект к определённому классу (через цепочку прототипов):

\[\] instanceof Array // true
{} instanceof Object // true
(() => {}) instanceof Function // true
new Date() instanceof Date // true

Не работает с примитивами — 1 instanceof Number → false.

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

JavaScript автоматически (или вручную) преобразует значения между типами:

  • К числу — при арифметических операциях (Number(value)).

  • К строке — при конкатенации (String(value)).

  • К логическому — в условиях (Boolean(value)).

Пример:

Boolean("") // false
Boolean("abc") // true
Number("42") // 42
String(123) // "123"

Список «ложных» значений (falsy), которые приводятся к false:

  • false

  • 0, -0

  • "" (пустая строка)

  • null

  • undefined

  • NaN

Все остальные значения считаются «истинными» (truthy).

6. Тип typeof против constructor

Для точной диагностики типа объекта иногда используется constructor:

(123).constructor === Number // true
"abc".constructor === String // true
\[\].constructor === Array // true
new Date().constructor === Date // true

Также можно использовать Object.prototype.toString.call(value):

Object.prototype.toString.call(\[\]) // "\[object Array\]"
Object.prototype.toString.call(null) // "\[object Null\]"
Object.prototype.toString.call(undefined) // "\[object Undefined\]"
Object.prototype.toString.call(123) // "\[object Number\]"

Этот метод — самый точный способ определения типа, особенно для встроенных объектов.