Skip to main content

Типи даних у JavaScript

У JavaScript існує вісім основних типів даних, які діляться на примітивні (сім штук) і посилальний, об'єктний (один). Примітив, це значення, що не є об'єктом і не має власних методів, а об'єкт, це контейнер для даних і функцій, який передається за посиланням.

Теорія

TL;DR

  • Типів рівно 8: Number, BigInt, String, Boolean, Null, Undefined, Symbol і Object.
  • Перші сім, примітиви: зберігаються за значенням, власних методів не мають.
  • Object, єдиний посилальний тип; Array, Function, Date, RegExp, Map, Set, це його підвиди.
  • Усі звичайні числа, це 64-бітні числа з рухомою комою (IEEE 754), звідси Infinity, -Infinity і NaN.
  • typeof null повертає 'object', це давня помилка мови, яку залишили заради сумісності.

Швидкий приклад

javascript
const count = 42; // Number const huge = 123456789012345678n; // BigInt const name = 'Tim'; // String const isAdmin = true; // Boolean const nothing = null; // Null let notAssigned; // Undefined const id = Symbol('id'); // Symbol const user = { name, [id]: 1 }; // Object console.log(typeof count, typeof huge, typeof name); // number bigint string console.log(typeof nothing, typeof notAssigned, typeof id); // object undefined symbol

Примітиви проти об'єктів

Примітив, це просте незмінне значення. Коли ви присвоюєте його іншій змінній, копіюється саме значення, тож дві змінні живуть незалежно. Об'єкт же лежить у пам'яті окремо, а змінна тримає лише посилання на нього, тому копіюється посилання, а не вміст.

javascript
let a = 10; let b = a; b = 20; console.log(a); // 10, примітив скопійовано за значенням const first = { n: 10 }; const second = first; second.n = 20; console.log(first.n); // 20, обидві змінні дивляться на той самий об'єкт

Примітиви не мають методів, але виклик 'abc'.toUpperCase() працює: рушій на льоту створює тимчасовий об'єкт-обгортку, бере з нього метод і одразу викидає обгортку.

Числові типи: Number і BigInt

Number

Числа, як цілі, так і з рухомою комою.

javascript
let a = 42; let b = 3.14;

Особливості:

  • Є спецзначення: Infinity, -Infinity, NaN (Not-a-Number).
  • Усі числа в JavaScript, це 64-бітні числа з рухомою комою (IEEE 754), тому 0.1 + 0.2 !== 0.3.
  • Безпечний діапазон цілих обмежений Number.MAX_SAFE_INTEGER (2 у степені 53 мінус 1).

BigInt

Використовується для дуже великих цілих чисел, що виходять за межі Number.

javascript
let big = 123456789012345678901234567890n;

Додається суфікс n. Дозволяє точно працювати з цілими числами будь-якої довжини.

BigInt не змішується з Number в арифметиці: 1n + 1 кидає TypeError, спершу потрібне явне перетворення.

Текст і логіка: String і Boolean

String

Рядки тексту в лапках: одинарних, подвійних або шаблонних.

javascript
let name = 'Tim'; let message = `Привіт, ${name}!`;

Рядки незмінні: під час «зміни» створюється новий рядок, а старий лишається недоторканим.

javascript
let s = 'abc'; s[0] = 'X'; console.log(s); // 'abc', присвоєння просто ігнорується

Boolean

Логічні значення: true або false.

javascript
let isAdmin = true; let isLoggedIn = false;

Використовуються в умовах, перевірках і логічних виразах. Хибними при приведенні до Boolean є лише false, 0, -0, 0n, '', null, undefined і NaN, усе інше істинне.

Порожні значення та Symbol

Null

Особливе значення, що позначає «нічого» або «порожньо», і присвоюється програмістом свідомо.

javascript
let user = null;

typeof null повертає 'object', це історична помилка JavaScript, так і залишилось.

Undefined

Змінна оголошена, але не має значення.

javascript
let x; console.log(x); // undefined

Присвоюється автоматично, якщо значення не задано: також це результат читання неіснуючої властивості та значення параметра, якого не передали.

Symbol

Унікальне незмінне значення, яке часто використовують як ключ об'єкта.

javascript
let id = Symbol('id'); let obj = { [id]: 123 }; console.log(Symbol('id') === Symbol('id')); // false

Кожен Symbol унікальний, навіть якщо опис однаковий. Символьні ключі не потрапляють у Object.keys() і JSON.stringify(), тому годяться для службових полів.

Object: посилальний тип

Зберігає набори даних і функції. Передається за посиланням, а не за значенням.

javascript
let user = { name: 'Tim', age: 25 }; let arr = [1, 2, 3]; let func = function () {};

Підвиди об'єктів:

  • Object, базовий тип.
  • Array, масив.
  • Function, функція.
  • Date, RegExp, Map, Set і так далі.
Тип данихПрикладОпис
Number42, 3.14, NaNЧисла
BigInt123nВеликі цілі
String'Hello', `Hi ${name}`Рядки
Booleantrue, falseЛогічний тип
NullnullВідсутність значення
UndefinedundefinedНевизначено
SymbolSymbol('id')Унікальний ідентифікатор
Object{}, [], function(){}Колекції та структури

Типові помилки

  • Називають масив окремим типом. typeof [1, 2] дає 'object'; щоб відрізнити масив, потрібен Array.isArray().
  • Плутають null і undefined. undefined, це «значення ще не з'явилось» від рушія, null, це свідомо поставлена порожнеча від розробника.
  • Забувають про typeof null === 'object' і будують на цьому перевірку на об'єкт: потрібна додаткова умова value !== null.
  • Порівнюють NaN із самим собою. NaN === NaN, це false, перевіряти треба через Number.isNaN().
  • Змішують BigInt і Number в одному виразі та отримують TypeError.
  • Вважають рядок змінним і намагаються присвоїти символ за індексом; такий рядок треба зібрати заново.

Коротка відповідь

Для співбесіди
Premium

Коротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.