JS
December 15, 2020

Типи даних в JS

JS - динамічно-типізована мова програмування. Це означає, що типи у ній є, але змінні можуть містити в собі будь-які дані незалежно від типу.

Всього у JS вісім типів даних:

  • number
  • BigInt
  • string
  • boolean
  • null
  • undefined
  • object
  • Symbol

Незважаючи на те, що null і undefined за логікою повинні мати тип object, вони є окремими типами. Так склалось.

null - це особливе значення, яке буквально означає "у змінну записане нічого" - тобто значення невідоме. Важливо, что це не є посиланням на "нічого", як у інших мовах програмування.

undefined - це також особливе значення, яке вказує на те, що значення змінної ще не було задане. За замовчуванням лежить у всіх "незаданих" змінних, якщо:

  • У змінну не записане значення при створенні;
  • Функція нічого не повертає, але ми хочемо отримати щось від неї (саме тому ми бачимо undefined після створення функції у консолі браузера).

Зазвичай для маніпуляції з "порожніми" зміниими використовують саме null, а ось undefined використовується тільки для того, щоб перевірити, чи було взагалі значення змінній задане.

Порівняння null і undefined на прикладі

Примітиви і object

Всі типи в JS, крім object, є примітивами. Це означає, що обʼєкти зберігають в собі "набір даних", а примітивні типи, як-от рядки - представляють самі себе. Ба більше, при своренні обʼєкту ми отримуємо посилання на нього, а при створенні примітиву - саме значення. Тобто такий фокус не пройде:

let s = "hello";
let c = s;
c += " world";
console.log(s) // все ще "hello"

Звичайно ви можете (і маєте) заперечити: "Але ж у рядків є методи і навіть поля, як-от length! Чому ж тоді це примітив???". І цьому є появнення.

Примітиви створені для оптимізації. Але для зручності в JS також є і класи, які представляють "обʼєктні" аналоги цих примітивів. Тобто в JS є такі класи як Number, String, Boolean, і вони також мають конструктори, як і в інших мовах.

Таким чином, коли ми хочемо, наприклад, отримати значення поля length або викликати метод toUpperCase у рядка, під капотом створюється обʼєкт-обгортка для рядка, викликається метод, повертається значення і обʼєкт видаляється.

Я сказав, що є класи Number, String... Так ось, екземпляри цих класів можна без проблем створити з використанням конструкторів:

const s = new String("hello");
console.log(typeof s); // object

Це інколи буває корисно, але взагалі-то не рекомендується так робити, і причину цього я вказав на другому рядку фрагменту коду вище - стрічка більше не стрічка, а object. Замість цього часто роблять так:

const numString = "123";
const num = Number(numString); // 123

Як бачимо, це швидкий варіант парсингу.

Помилки typeof

І наостанок кілька неточностей в JS:

  • typeof(null); // "object" - null - це окремий тип;
  • typeof(alert); // "function" - типу function не існує, це зроблено для зручності розробки.

Висновки

JS - динамічно-типізована мова програмування - змінні можуть містити в собі дані будь-якого типу.
В JS нараховується вісім типів даних: number, BigInt, string, boolean, null, undefined, object, Symbol.
null і undefined - це окремі типи, незалежні від object. null зазвичай вказує на те, що змінні присвоєне "нічого", а undefined - що змінній взагалі нічого не було присвоєно. Також undefined за замовчуванням повертається з функцій, які нічого не повертають.
Всі типи, окрім object, є примітивами. Те, що, до прикладу, у рядків, є методи і поля, пояснюється тим, що при зверненні до них, рядки під капотом конвертують у їх обʼєктні репрезентації.
Використовувати обʼєктні репрезентації замість примітивних аналогів вкрай не рекомендується, бо тип у них буде object. Замість цього, до прикладу, для парсингу, краще використовувати відповідні функції, як-от Number().
У оператора typeof є кілька неточностей:
- typeof(null); // "object" - null - це окремий тип;
- typeof(alert); // "function" - типу function не існує, це зроблено для зручності розробки.

Джерела

https://learn.javascript.ru/types