У даному розділі представлені концепції, об'єкти та функції, які використовуються, щоб працювати та виконувати розрахунки з числами та датами у JavaScript. Це враховує використання чисел, записаних у різних системах числення, в тому числі десятковій, двійковій та шістнадцятковій, а також використання глобального об'єкта Math
для виконання найрізноманітніших математичних операцій над числами.
Числа
У JavaScript, числа реалізовані у 64-бітному бінарному форматі IEEE 754 з подвійною точністю (тобто, число між ±2−1022 та ±2+1023, або приблизно від ±10−308 до ±10+308, з числовою точністю у 53 біти). Цілі значення до ±253 − 1 можуть бути відображені точно.
Додатково числовий тип має три символьні значення: +
Infinity
, -
Infinity
та NaN
(not-a-number - не число).
Нещодавнім доповненням JavaScript є тип BigInt
, який дає можливість оперувати з дуже великими цілими числами. Хоча існують застереження у використанні BigInt
; наприклад, ви не можете змішувати та співставляти значення BigInt
та Number
в рамках однієї операції, і ви не можете використовувати об'єкт Math
зі значеннями BigInt
.
У статті Типи та структури даних в JavaScript числовий тип даних описаний в контексті інших примітивних типів JavaScript.
Ви можете використовувати чотири типа числових літералів: десяткові, двійкові, вісімкові та шістнадцятковий.
Десяткові числа
1234567890
42
// Будьте уважні при використанні нулів на початку числа
0888 // 888 розбирається як десяткове число
0777 // розбирається як вісімкове число у нестрогому режимі (десяткове число 511)
Зверніть увагу, що десятковий літерал може починатися з нуля (0
) за яким розташована інша десяткова цифра, але, якщо кожна цифра після 0
менша за 8, то число розбирається як вісімкове.
Двійкові числа
Синтаксис двійковичх чисел використовує нуль попереду, за яким розташована латинська буква "B" (0b
або 0B
). Якщо цифри після 0b
не є 0 або 1, викидається наступний виняток SyntaxError
: "Missing binary digits after 0b".
var FLT_SIGNBIT = 0b10000000000000000000000000000000; // 2147483648
var FLT_EXPONENT = 0b01111111100000000000000000000000; // 2139095040
var FLT_MANTISSA = 0B00000000011111111111111111111111; // 8388607
Вісімкові числа
Синтаксис вісімкових чисел теж використовує нуль попереду. Якщо числа після 0
не входять у діапазон від 0 до 7, то число буде інтерпретоване як десяткове.
var n = 0755; // 493
var m = 0644; // 420
Строгий режим у ECMAScript 5 забороняє вісімковий синтаксис. Вісімковий синтаксис не є частиною ECMAScript 5, але він підтримується всіма переглядачами додаванням нуля попереду вісімкового числа: 0644 === 420
, а "\045" === "%"
. У ECMAScript 2015 вісімкові значення підтримуються, якщо вони мають префікс 0o
, наприклад:
var a = 0o10; // ES2015: 8
Шістнадцяткові числа
Синтаксис шістнадцяткових чисел використовує нуль попереду, за яким розташована латинська літера "X" (0x
або 0X
). Якщо числа після 0x не входять у діапазон (0123456789ABCDEF), то буде викинутий наступний виняток SyntaxError
: "Identifier starts immediately after numeric literal".
0xFFFFFFFFFFFFFFFFF // 295147905179352830000
0x123456789ABCDEF // 81985529216486900
0XA // 10
Експоненціальний запис
1E3 // 1000
2e6 // 2000000
0.1e2 // 10
Об'єкт Number
Вбудований об'єкт Number
має властивості для числових констант, такі як масимальне числове значення, не-число (not-a-number) та нескінченність. Ви не можете змінювати значення цих властивостей і використовуєте їх наступним чином:
var biggestNum = Number.MAX_VALUE;
var smallestNum = Number.MIN_VALUE;
var infiniteNum = Number.POSITIVE_INFINITY;
var negInfiniteNum = Number.NEGATIVE_INFINITY;
var notANum = Number.NaN;
Ви завжди посилаєтесь на властивість попередньо визначенного об'єкта Number
, як це показано вище, а не на властивість об'єкта Number
, створеного вами.
Наступна таблиця підсумовує властивості об'єкта Number
.
Властивість | Опис |
---|---|
Number.MAX_VALUE |
Найбільше число, доступне для відображення (±1.7976931348623157e+308 ) |
Number.MIN_VALUE |
Найменше число, доступне для відображення ( |
Number.NaN |
Спеціальне значення "не-число" (not-a-number) |
Number.NEGATIVE_INFINITY |
Спеціальне значення від'ємна нескінченність; повертається при переповненні |
Number.POSITIVE_INFINITY |
Спеціальне значення додатна нескінченність; повертається при переповненні |
Number.EPSILON |
Різниця між 1 та найменшим числом, більшим за 1 , що може бути представлене об'єктом Number (2.220446049250313e-16 ) |
Number.MIN_SAFE_INTEGER |
Мінімальне ціле безпечне число у JavaScript (−253 + 1 або −9007199254740991 ) |
Number.MAX_SAFE_INTEGER |
Максимальне ціле безпечне число у JavaScript (+253 − 1 або +9007199254740991 ) |
Метод | Опис |
---|---|
Number.parseFloat() |
Розбирає рядковий аргумент та повертає число з плаваючою крапкою, яке вдалося розпізнати. Аналог глобальної функції parseFloat() . |
Number.parseInt() |
Розбирає рядковий аргумент та поверає ціле число в заданій системі числення. Аналог глобальної функції parseInt() . |
Number.isFinite() |
Визначає, чи є передане значення скінченним числом. |
Number.isInteger() |
Визначає, чи є передане значення цілим числом. |
Number.isNaN() |
Визначає, чи є передане значення NaN . Більш надійніша версія оригінальної глобальної функції isNaN() . |
Number.isSafeInteger() |
Визначає, чи є передане значення безпечним цілим числом. |
Прототип Number
надає методи для отримання інформації з об'єктів Number
різноманітних форматів. Наступна таблиця наводить методи Number.prototype
.
Методи | Опис |
---|---|
toExponential() |
Повертає рядок, що експоненціальний запис числа. |
toFixed() |
Повертає рядок, що містить запис числа у форматі з нерухомою крапкою. |
toPrecision() |
Повертає рядок, що містить запис числа із зазначеною точністю у форматі з нерухомою крапкою. |
Об'єкт Math
Вбудований об'єкт Math
має властивості та методи для математичних констант та функцій. Наприклад, властивість PI
об'єкту Math
має значення пі (3.141...), яке використовується у застосунку так:
Math.PI
Аналогічно, стандартні математичні функції є методами об'єкта Math
. Сюди входять тригонометричні, логарифмічні, експоненціальні та інші функції. Наприклад, якби вам знадобилась тригонометрична функція сінус, ви б написали
Math.sin(1.56)
Зверніть увагу, що всі тригонометричні методи об'єкта Math
в якості аргументів приймають величини в радіанах.
В даній таблиці наведені методи об'єкта Math
.
Методи | Опис |
---|---|
abs() |
Абсолютне значення |
sin() , cos() , tan() |
Стандартні тригонометричні функції; з аргументом в радіанах |
asin() , acos() , atan() , atan2() |
Обернені тригонометричні функції; повертають значення в радіанах. |
sinh() , cosh() , tanh() |
Гіперболічні функції; аргумент - гіперболічний кут. |
asinh() , acosh() , atanh() |
Зворотні, гіперболічні функцій; повертають гіперболічний кут. |
Експоненційні та логарифмічні фукнції. | |
floor() , ceil() |
Повертає найбільне/найменше ціле, яке менше/більше або дорівнює аргументу. |
min() , max() |
Повертає мінімальне або максимальне (відповідно) значення зі списку розділених комою чисел, переданих як аргумент. |
random() |
Повертає випадкове число в інтервалі між 0 та 1. |
round() , fround() , trunc() , |
Фукнції округлення та обрізання. |
sqrt() , cbrt() , hypot() |
Квадратний корінь, кубічний корінь, корінь квадратний з суми квадратів аргументів. |
sign() |
Знак числа, що вказує, чи є число додатним, від'ємним, чи нулем. |
clz32() ,imul() |
Кількість перших нульових бітів у 32-бітному двійковому представлені. Результат C-подібного 32-бітного множення двох аргументів. |
На відміну від багатьох інших об'єктів, вам не потрібно створювати екземпляри об'єкта Math
. Завжди слід використоввати вбудований глобальний об'єкт Math
безпосередньо.
Об'єкт Date
JavaScript не має окремого типу даних для дат. Однак, ви можете скористатись об'єктом Date
та його методами для роботи з датою та часом у вашому проекті. Об'єкт Date
має величезну кількість методів для встановлення, отримання та маніпулювання датами, але не має жодних властивостей.
JavaScript оперує датами подібно до Java. Ці дві мови програмування мають багато подібних методів та зберігають дату як кількість мілісекунд, що минули з 00:00:00 1 січня 1970 року, в той час, як часова мітка Unix позначає кількість секунд, що минули з 00:00:00 1 січня 1970 року.
Інтервал значень, які може приймати об'єкт Date
, знаходиться від -100,000,000 до 100,000,000 днів відносно 1 січня 1970 року за UTC.
Щоб створити об'єкт Date
:
var dateObjectName = new Date([parameters]);
де dateObjectName
- це ім'я створеного об'єкта Date
; це може бути як новий об'єкт, так і властивість вже існуючого об'єкта.
Виклик Date
без оператора new
повертає теперішню дату та час у вигляді рядка.
Параметри (parameters
) у наведеному записі можуть бути одним з наступних значень:
- Порожнє значення: створюється сьогоднішня дата та час. Наприклад,
today = new Date();
. - Рядок, що представляє дату в наступній формі: "Місяць день, рік години:хвилини:секунди." Наприклад,
var Xmas95 = new Date("December 25, 1995 13:30:00")
. Якщо не вказані години, хвилини чи секунди, значення замінюються нулями. - Набір цілочисельних значень для року, місяця та дня. Наприклад,
var Xmas95 = new Date(1995, 11, 25)
. - Набір цілочисельних значень для року, місяця, дня, годин, хвилин та секунд. Наприклад,
var Xmas95 = new Date(1995, 11, 25, 9, 30, 0);
.
Методи об'єкта Date
Методи об'єкта Date
для роботи з датами та часом підпадають під такі категорії:
- методи "set", для встановлення дати та часу в об'єктах
Date
. - методи "get", для отримання дати та часу з об'єктів
Date
. - методи "to", для отримання рядкових значень з об'єктів
Date
. - методи розбору та UTC, для розбору рядків
Date
.
За допомогою методів "get" та "set" можна встановлювати та отримувати значення секунд, хвилин, годин, днів місяця, днів тижня, місяць та рік окремо. Зверніть увагу на метод getDay
, який повертає день тижня, але не існує відповідного методу setDay
, оскільки день тижня визначається автоматично. Всі ці методи використовують цілі числа для представлення відповідних даних наступним чином:
- Секунди та хвилини: від 0 до 59
- Години: від 0 до 23
- День: від 0 (неділя) до 6 (субота)
- Дата: від 1 до 31 (день місяця)
- Місяць: від 0 (січень) до 11 (грудень)
- Рік: роки з 1900
Припустимо, ви визначаєте наступну дату:
var Xmas95 = new Date('December 25, 1995');
Тоді Xmas95.getMonth()
повертає 11, а Xmas95.getFullYear()
повертає 1995.
Методи getTime
та setTime
зручні для порівняння дат. Метод getTime
повертає кількість мілесекунд від 00:00:00, 1 січня 1970 року.
Наприклад, наступний код показує, скільки днів залишилось у цьому році:
var today = new Date();
var endYear = new Date(1995, 11, 31, 23, 59, 59, 999); // Встановлюємо день та місяць
endYear.setFullYear(today.getFullYear()); // Встановлюємо цей рік
var msPerDay = 24 * 60 * 60 * 1000; // Кількість мілісекунд в одному дні
var daysLeft = (endYear.getTime() - today.getTime()) / msPerDay;
var daysLeft = Math.round(daysLeft); //Повертає кількість днів, які залишилися в цьому році
Цей приклад створює об'єкт Date
на ім'я today
, який містить в собі сьогоднішню дату. Далі він створює об'єкт Date
на ім'я endYear
, якому присвоюється поточний рік. Потім, використовуючи кількість мілісекунд в одному дні, вираховує кількість днів між today
та endYear
, використовуючи getTime
та округливши результат до цілого значення кількості днів.
Метод parse
корисний для присвоєння рядкових значень існуючим об'єктам Date
. Наприклад, наступний код використовує parse
та setTime
для присвоєння дати об'єкту IPOdate
:
var IPOdate = new Date();
IPOdate.setTime(Date.parse('Aug 9, 1995'));
Приклад
У наступному прикладі, функція JSClock()
повертає час у форматі цифрового годинника.
function JSClock() {
var time = new Date();
var hour = time.getHours();
var minute = time.getMinutes();
var second = time.getSeconds();
var temp = '' + ((hour > 12) ? hour - 12 : hour);
if (hour == 0)
temp = '12';
temp += ((minute < 10) ? ':0' : ':') + minute;
temp += ((second < 10) ? ':0' : ':') + second;
temp += (hour >= 12) ? ' P.M.' : ' A.M.';
return temp;
}
Функція JSClock
спочатку створює новий об'єкт Date
, який називається time
; оскільки жодних аргументів не надано, час створюється на основі поточної дати та часу. Далі викликами методів getHours
, getMinutes
та getSeconds
присвоюються значення поточної години, хвилини та секунди змінним hour
, minute
та second
.
Наступні чотири інструкції створюють рядкове значення на основі значення часу. Перша інструкція створює змінну temp
, присвоюючи їй значення за допомогою умовного виразу: якщо hour
більше за 12, то (hour - 12
), інакше просто hour
, у випадку ж коли hour
дорівнює 0, він набуває значення 12.
Наступна інструкція додає значення minute
до змінної temp
. Якщо значення minute
менше за 10, умовний вираз додає рядок з нулем попереду; інакше додається рядок з двокрапкою для розмежування. Далі аналогічним чином інструкція додає до temp
секунди.
Зрештою, умовний вираз додає "P.M." до temp
, якщо hour
дорівнює або більший за 12; інакше, додається "A.M.".