Comment on page
Докладніше про типи даних
Тут не всі існуючі типи, а лише ті, з якими ми зіткнемося при розв'язанні задач.
Якщо елементи цього розділу будуть вам не до кінця зрозумілі - це ОК, просто йдіть далі. Частина цієї інформації може виявитись не дуже практичною для вас.
Він же Boolean. В числових виразах зазвичай і результат числовий, наприклад
1+1
обчислюється в число 2
, а от в логічних виразах результат - булевий. Булеве значення може бути або true (вираз "істинний") або false (вираз "хибний"), інших варіантів нема. Приклад: 2 > 1
— цей вираз обчислюється в true, 1 > 1+1
— цей вираз false. 2 > 2
— цей теж false. Отже компʼютер, окрім роботи із числами, може "обчислювати" логічні вирази типу
2 > 1 && 3 > 2
(де &&
читається як "і також") в якесь конкретне одне значення (для даного прикладу це true). Розуміння цього дозволяє бачити менше магії в коді, а також писати елегантніші програми. Проте зараз вам це знання навряд чи дуже допоможе. Якщо створити змінну та не присвоїти їй жодного значення, вона матиме тип даних
undefined
. Тобто там не лежатиме 0 чи пустий шмат тексту. Там реально знаходитиметься undefined, що перекладається як "не визначено", чи по-простому "пустота". let message;
console.log(message);
// на нашому сайті js.ide.shpp.me, якщо ви запустите цей код
// то ви побачите червоний знак питання замість слова undefined
// ...та це ми просто виразніше візуалізуємо значення undefined
У С++, Java та інших мовах є окремі типи даних для цілих чисел (1, 42, 100500 і т.п ) та чисел з рухомою комою (1.234, 3.14, 5.0, 0.5 і т.п.). Але у JavaScript і для цілих, і для дробних чисел — один тип (він так і називається:
number
).Крім того, є кілька символічних значень:
+Infinity
(додатна нескінченність), -Infinity
(від'ємна нескінченність), і NaN
(не число). Через низку причин вони теж мають тип number
Яка практична користь цього знання? Ну, можливо скоро ви випадково стикнетесь із NaN...
console.log("зараз поділимо нуль на нуль... ");
console.log("результат на наступній строчці: ");
console.log(0 / 0);
// на нашому сайті js.ide.shpp.me, якщо ви запустите цей код
// то ви побачите червоний символ замість слова NaN
// ...та це ми просто виразніше візуалізуємо значення NaN
В JavaScript для подання текстових даних служить тип String. Тобто якийся текст у кавичках і має тип String. Будь-яка строчка тексту являє собою ланцюжок «елементів» — символів. Кожен такий елемент займає свою позицію в ряд ку. Перший елемент має індекс (позицію) 0, наступний — 1, і так далі. В житті нумеруємо все з 1, а от у програмуванні часто позиція починається з 0.
Довжина рядка - це кількість елементів в ньому. Рядки описують в коді між 'одинарними' або "подвійними" лапками. На відміну від мов, подібних C, рядки в JavaScript є незмінні (ще кажуть "іммутабельні"). Це означає, що після того, як значення створено, його не можна модифікувати. Залишається лише створити новий рядок шляхом здійснення якоїсь операції над вихідним рядком.
Яке практичне знання цього? Пізніше, на етапі вивчення масивів та рядків, ви навчитесь детально працювати, посимвольно, з рядками. Поки вже зараз круто знати, що ви можете склеювати разом шматки тексту звичайним плюсиком:
console.log("hello" + " " + "javascript")
Щоб дізнатись тип даних чого завгодно, треба викликати команду
typeof
let a = 5;
console.log("a " + typeof a);
let b = "5";
console.log("b " + typeof b);
let d;
console.log("d " + typeof d);
// це працює не лише зі змінними, а й з літералами, тобто "голими" значеннями
console.log("3 > 2 " + typeof (3 > 2));
// і т.д і т.п.
Яке практичне в икористання цього? Якщо сумніватиметесь щодо того, що саме лежить у ваших змінних, то зможете перевірити це за допомогою typeof.
Оскільки типів даних більш ніж один, іноді виникають ситуації коли нам треба один тип даних перетворити на інший, щоб програма поводилась саме так, як ми від неї очікуємо. Це називають приведенням типів (або іноді "кастуванням"), і часто таке приведення відбувається без ручного контролю з боку програміста. Наприклад:
console.log(1 + 2); // 3 (тут все ок)
console.log(1 + "2"); // 12 (число та текст несумісні, довелось привести 1 в текст)
Зміна типу відбувається, якщо результат виконання операції зі змінною вихідного типу неясний. Наприклад, не можна точно сказати, що вийде в результаті складання рядка з числом, але операція додавання двох чисел очевидна, і в цьому випадку логічно привести число до тексту. У другому прикладі після перетворення числа до текстового рядка сталася операція додавання двох рядків (конкатенація)
Іноді сам програміст може змінити тип змінної (а тип змінної - це по суті тип даних, що лежить у цій змінній), застосувавши до неї деякі операції. Наприклад, операції інкременту або декременту над змінною що в має в собі текст - автоматично перетворять її на змінну із числом.
let a = "1";
++a;
console.log(typeof a); // number, хоча ж була стрінгом!
let b = "1";
--b;
console.log(typeof b); // number, хоча ж була стрінгом!
Якщо значення, що міститься в рядку не може бути визначене як число, то результатом виконання інкремента або декремента над таким текстовим рядком буде спеціальне значення
NaN
типу number
.let c = "not-a-number";
++c;
console.log(typeof c); // хоч значення змінної - NaN, проте тип все одно number))
Варто зауважити, що не потрібно вдаватися до такого способу приведення рядка до числа через його погану читабельність і неочевидність. Для цього завдання в js існують вбудовані функції parseInt і parseFloat (є ще один елегантний спосіб, ми теж його вчимо). Як перший аргумент, ці функції приймають рядок, яку необхідно привести до числа.
Функція parseInt використовується для перетворення рядка в ціле число, а функція parseFloat для перетворення в дробове.
let a = parseInt("10");
console.log("a = " + a)
console.log("typeof a: " + typeof a);
// a = 10
// typeof a: number
let pi = parseInt("3.1415");
console.log("parseInt, pi = " + pi); // pi = 3
pi = parseFloat("3.1415");
console.log("parseFloat, pi = " + pi); // pi = 3.1415
Зверніть увагу, що в рядку може бути будь-яке літеральне числове значення, в тому числі в шістнадцятковому, вісімковому або експоненційному вигляді (зараз неважливо якщо ви не розумієте що це за вигляди такі).
let a = parseInt("010");
console.log("a = " + a); // a = 10
a = parseInt("0xAA");
console.log("a = " + a); // a = 170
a = parseFloat("1e-10");
console.log("a = " + a); // a = 1e-10 (1e-10 = 1 * 10 ^ -10 = 0.0000000001)
Якщо
parseInt()
і parseFloat()
приймають першим параметром щось, що не можна привести до числа, то результатом завжди буде NaN.let a = parseInt("not a number");
console.log("a = " + a); // a = NaN
a = parseFloat("not a number");
console.log("a = " + a); // a = NaN
let a = "5";
console.log(typeof a);
a = +"5";
console.log(typeof a);
// знову ж, це працює і з літералами
console.log(typeof +"123")
console.log(typeof +"4.567")
Яка користь від цього знання? Якщо від користувача прийде число в текстовому вигляді, то додавання одиниці до даних користувача не обчислюватиметься по правилам математики. Наприклад, користувач дав вам одиницю, і ви поклали її в змінну А. Якщо зробити
console.log(A+1)
то ви побачите 11 замість 2 (і ви вже розумієте чому, а якщо ні - то перечитайте останні абзаци). Тому вам доведеться спочатку перетворити дані користувача у реальне число, а потім вже робити +1.В JavaScript значення будь-якого типу можна привести до рядка. Вище вже говорилося про те, що при конкатенації рядка з числом, число приводиться до рядка, і лише потім відбувається конкатенація. Так буде відбуватися зі значенням будь-якого типу.
// йой! ми тут використовуємо "масиви", "функції" та "обʼєкти"
// і ми їх ще не вчили... то може треба поки пропустити цей шмат коду?
// ...і ще одне!! якщо ви запускатимете цей приклад
// на нашому сайті js.ide.shpp.me
// ...то побачите інший результат ;) і попередження від нашої команди
let str = "Object: " + {};
console.log(str) // напише: Object: [object Object]
str = "Array: " + [1, 2, 3];
console.log(str) // напише: Array: 1,2,3
function sum(a, b) {
return a + b;
}
str = "Function: " + sum;
console.log(str) /* напише: Function: function sum(a, b) {
return a + b;
} */
Фактично, при приведенні об'єкта до рядка, неявним чином викликається метод (команда) toString, який так само можна викликати явно.
// якщо ви запускатимете цей приклад
// на нашому сайті js.ide.shpp.me
// ...то побачите інший результат ;) і попередження від нашої команди
let p = {x: 2, y: 4}, str;
str = p.toString();
console.log(typeof str); // виведе: string
console.log(str); // виведе: [object Object]
str = [1, 2, 3].toString();
console.log(typeof str); // виведе: string
console.log(str); // виведе: 1,2,3
Яка вам користь з цього зараз? Головне зрозуміти, що якщо ви пхаєте в console.log щось неправильне, то на екрані зʼявиться щось неправильне, і треба все ж уважніше подивитись що ж ви пхаєте в console.log :)
Перетворення в число відбувається при виконанні математичних операцій і при виконанні операції порівняння з приведенням типу (==,! =), При цьому значення false і порожній масив перетворюються в значення 0 типу number.
console.log (false == 0); // true
console.log([] == 0); // true
Логічне значення true при використанні в арифметичних виразах приводиться до одиниці.
let a = true + true + true; // 1 + 1 + 1
console.log(a); // 3
Непорожній масив, об'єкт і функція при використанні в арифметичних виразах приводяться до рядка. Добре що ми цих понять ще не вчили, тож можемо пропустити цей шмат коду))
let arr = [1, 2, 3];
console.log(arr + 4); // 1,2,34
function sum(a, b){
return a + b;
}
console.log(sum + 5); // function sum(a, b){return a + b}5
Як видно, неявне перетворення типів у JS далеко не завжди очевидне, тому варто його уникати, використовуючи функції для явного приведення типів, такі як
parseInt
, parseFloat
і toString
.Last modified 1yr ago