Типи даних в JS
JS - динамічно-типізована мова програмування. Це означає, що типи у ній є, але змінні можуть містити в собі будь-які дані незалежно від типу.
Всього у JS вісім типів даних:
Незважаючи на те, що null і undefined за логікою повинні мати тип object, вони є окремими типами. Так склалось.
null - це особливе значення, яке буквально означає "у змінну записане нічого" - тобто значення невідоме. Важливо, что це не є посиланням на "нічого", як у інших мовах програмування.
undefined - це також особливе значення, яке вказує на те, що значення змінної ще не було задане. За замовчуванням лежить у всіх "незаданих" змінних, якщо:
- У змінну не записане значення при створенні;
- Функція нічого не повертає, але ми хочемо отримати щось від неї (саме тому ми бачимо
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
не існує, це зроблено для зручності розробки.