Numbers and dates

В даному розділі представлені концепції, об'єкти та фугкції, які використовуються для роботи та розрахунків, використовуючи числа та дати в 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 or 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 має властивості для числових констант, такі як масимальне числове значення, не-число(NaN) та безкінечність (infinity). Ви не можете змінювати значення цих властивостей і повинні використовувати їх, як показано нижче:

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 Спеціальне значення "не-число"
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 має значення pi (3.141...), яке ви могли б використовувати в додатку як

Math.PI

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

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 року. 

Інтервал значень, які може приймати об'єкт Date знаходиться від -100,000,000 до 100,000,000 днів відносно 1 січня, 1970 UTC.

Для того, щоб створити власний екземпляр об'єкту Date:

var dateObjectName = new Date([parameters]);

де dateObjectName ім'я змінної в яку присвоюється створене значення з типом Date; замість цієї змінної, присвоїти створене значення можна, як властивість будь-якому існуючому об'єкту.

Виклик Date як функція, без оператора new, повертає теперішню дату та час як рядок.

parameters (в попередньому синтаксисі) може бути представлений одним з наступних значень:

  • Пусто: створюється сьогоднішня дата та час. Наприклад, today = new Date();.
  • Рядок, який представляє дату в наступній формі: "Month day, year hours:minutes:seconds."  Наприклад, 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 в рядковому вигляді. 
  • "parse" та UTC методи, для розпізнавання Date рядків.

За допомогою методів групи "get" та "set" ви можете встановлювати секунди, хвилини, години, дні місяця, дні тижнів, місяці та роки окремо. Слід звернути увагу на метод getDay, який повертає день тижня, але не існує відповідного методу setDay, оскільки день тижня встановлюється(вираховується) автоматично. Всі ці методи використовують цілі числа для представлення відповідних даних, як показано ничще:

  • Секунди та хвилини: 0 to 59
  • Години: 0 to 23
  • День: 0 (Неділя) to 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 дорівнює 0 - використовується фіксоване значення "12".

Наступний вираз додає значення minute до змінної temp. Якщо значення minute менше від 10, умовний вираз додає рядок з лідуючим нулем попереду; інакше додається рядок з вертикальними двома крапками. Після цього, аналогічним чином, вираз додає секуни до temp.

В кінці кінців, умовний вираз додає "P.M." до temp якщо hour дорівнює або більше 12; інакше додається "A.M.".