Типи даних в 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не існує, це зроблено для зручності розробки.