Типи даних у 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', це давня помилка мови, яку залишили заради сумісності.
Швидкий приклад
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Примітиви проти об'єктів
Примітив, це просте незмінне значення. Коли ви присвоюєте його іншій змінній, копіюється саме значення, тож дві змінні живуть незалежно. Об'єкт же лежить у пам'яті окремо, а змінна тримає лише посилання на нього, тому копіюється посилання, а не вміст.
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
Числа, як цілі, так і з рухомою комою.
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.
let big = 123456789012345678901234567890n;Додається суфікс
n. Дозволяє точно працювати з цілими числами будь-якої довжини.
BigInt не змішується з Number в арифметиці: 1n + 1 кидає TypeError, спершу потрібне явне перетворення.
Текст і логіка: String і Boolean
String
Рядки тексту в лапках: одинарних, подвійних або шаблонних.
let name = 'Tim';
let message = `Привіт, ${name}!`;Рядки незмінні: під час «зміни» створюється новий рядок, а старий лишається недоторканим.
let s = 'abc';
s[0] = 'X';
console.log(s); // 'abc', присвоєння просто ігноруєтьсяBoolean
Логічні значення: true або false.
let isAdmin = true;
let isLoggedIn = false;Використовуються в умовах, перевірках і логічних виразах. Хибними при приведенні до Boolean є лише
false,0,-0,0n,'',null,undefinedіNaN, усе інше істинне.
Порожні значення та Symbol
Null
Особливе значення, що позначає «нічого» або «порожньо», і присвоюється програмістом свідомо.
let user = null;
typeof nullповертає'object', це історична помилка JavaScript, так і залишилось.
Undefined
Змінна оголошена, але не має значення.
let x;
console.log(x); // undefinedПрисвоюється автоматично, якщо значення не задано: також це результат читання неіснуючої властивості та значення параметра, якого не передали.
Symbol
Унікальне незмінне значення, яке часто використовують як ключ об'єкта.
let id = Symbol('id');
let obj = { [id]: 123 };
console.log(Symbol('id') === Symbol('id')); // falseКожен Symbol унікальний, навіть якщо опис однаковий. Символьні ключі не потрапляють у
Object.keys()іJSON.stringify(), тому годяться для службових полів.
Object: посилальний тип
Зберігає набори даних і функції. Передається за посиланням, а не за значенням.
let user = { name: 'Tim', age: 25 };
let arr = [1, 2, 3];
let func = function () {};Підвиди об'єктів:
Object, базовий тип.Array, масив.Function, функція.Date,RegExp,Map,Setі так далі.
| Тип даних | Приклад | Опис |
|---|---|---|
| Number | 42, 3.14, NaN | Числа |
| BigInt | 123n | Великі цілі |
| String | 'Hello', `Hi ${name}` | Рядки |
| Boolean | true, false | Логічний тип |
| Null | null | Відсутність значення |
| Undefined | undefined | Невизначено |
| Symbol | Symbol('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. - Вважають рядок змінним і намагаються присвоїти символ за індексом; такий рядок треба зібрати заново.
Коротка відповідь
Для співбесідиКоротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.