Какие типы данных существуют в 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\]"
Этот метод — самый точный способ определения типа, особенно для встроенных объектов.