Числа та дати

У даному розділі представлені концепції, об'єкти та функції, які використовуються, щоб працювати та виконувати розрахунки з числами та датами у 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
Властивість Опис
Number.MAX_VALUE Найбільше число, доступне для відображення (±1.7976931348623157e+308)
Number.MIN_VALUE

Найменше число, доступне для відображення (±5e-324)

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
Метод Опис
Number.parseFloat() Розбирає рядковий аргумент та повертає число з плаваючою крапкою, яке вдалося розпізнати.
Аналог глобальної функції parseFloat().
Number.parseInt() Розбирає рядковий аргумент та поверає ціле число в заданій системі числення.
Аналог глобальної функції parseInt().
Number.isFinite() Визначає, чи є передане значення скінченним числом.
Number.isInteger() Визначає, чи є передане значення цілим числом.
Number.isNaN() Визначає, чи є передане значення NaN. Більш надійніша версія оригінальної глобальної функції  isNaN().
Number.isSafeInteger() Визначає, чи є передане значення безпечним цілим числом.

Прототип Number надає методи для отримання інформації з об'єктів Number різноманітних форматів. Наступна таблиця наводить методи Number.prototype.

Методи Number.prototype
Методи Опис
toExponential() Повертає рядок, що експоненціальний запис числа.
toFixed() Повертає рядок, що містить запис числа у форматі з нерухомою крапкою.
toPrecision() Повертає рядок, що містить запис числа із зазначеною точністю у форматі з нерухомою крапкою.

Об'єкт Math

Вбудований об'єкт Math має властивості та методи для математичних констант та функцій. Наприклад, властивість PI об'єкту Math має значення пі (3.141...), яке використовується у застосунку так:

Math.PI

Аналогічно, стандартні математичні функції є методами об'єкта Math. Сюди входять тригонометричні, логарифмічні, експоненціальні та інші функції. Наприклад, якби вам знадобилась тригонометрична функція сінус, ви б написали

Math.sin(1.56)

Зверніть увагу, що всі тригонометричні методи об'єкта Math в якості аргументів приймають величини в радіанах.

В даній таблиці наведені методи об'єкта Math.

Методи Math
Методи Опис
abs() Абсолютне значення
sin(), cos(), tan() Стандартні тригонометричні функції; з аргументом в радіанах
asin(), acos(), atan(), atan2() Обернені тригонометричні функції; повертають значення в радіанах.
sinh(), cosh(), tanh() Гіперболічні функції; аргумент - гіперболічний кут.
asinh(), acosh(), atanh() Зворотні, гіперболічні функцій; повертають гіперболічний кут.

pow(), exp()expm1(), log10(), log1p(), log2()

Експоненційні та логарифмічні фукнції.
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.".