Запропонувати правкуПокращити цю статтюДопрацюйте відповідь до «Типи даних у JavaScript». Ваші зміни проходять модерацію перед публікацією.Потрібне підтвердженняКонтентЩо ви змінюєте🇺🇸EN🇺🇦UAПереглядЗаголовок (UA)Коротка відповідь (UA)**У JavaScript вісім типів даних: сім примітивних (Number, BigInt, String, Boolean, Null, Undefined, Symbol) і один посилальний тип Object.** Примітив, це значення без власних методів, яке копіюється за значенням; Object зберігає набори даних і функції та передається за посиланням. Масиви, функції, `Date`, `Map`, `Set` окремими типами не є, це підвиди об'єкта. ```javascript typeof 42; // 'number' typeof 10n; // 'bigint' typeof Symbol('id'); // 'symbol' typeof null; // 'object' - історична помилка мови typeof [1, 2, 3]; // 'object' ``` **Ключове:** сім примітивів плюс Object, разом вісім; примітиви копіюються за значенням, об'єкти, за посиланням.Показується над повною відповіддю для швидкого нагадування.Відповідь (UA)Зображення**У 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` і так далі. | Тип даних | Приклад | Опис | | --- | --- | --- | | **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`. - **Вважають рядок змінним** і намагаються присвоїти символ за індексом; такий рядок треба зібрати заново.Для рев’юераПримітка для модератора (необов’язково)Бачить лише модератор. Прискорює рев’ю.