**Створення об'єктів Date**
```javascript
new Date() // поточна дата і час
new Date('2024-03-15') // з ISO-рядка (парситься як UTC опівночі)
new Date(2024, 2, 15) // рік, місяць (з нуля!), день — 15 березня
new Date(2024, 2, 15, 10, 30) // рік, місяць, день, година, хвилина
Date.now() // поточна мітка часу в мс (без 'new')
```
**Пастка нумерації місяців з нуля**
Січень = 0, Грудень = 11. Це плутає майже всіх:
```javascript
new Date(2024, 0, 1) // 1 січня 2024 — не лютий
new Date(2024, 11, 31) // 31 грудня 2024
// Безпечніше: завжди парси з ISO-рядка, щоб уникнути пастки індексації
new Date('2024-03-15') // однозначно
```
**Читання компонентів дати**
```javascript
const d = new Date('2024-03-15T10:30:00Z');
// UTC-методи — безпечні для арифметики дат
d.getUTCFullYear() // 2024
d.getUTCMonth() // 2 (березень, з нуля)
d.getUTCDate() // 15 (день місяця)
d.getUTCHours() // 10
d.getUTCMinutes() // 30
// Локальні методи — залежать від часового поясу користувача
d.getFullYear() // може відрізнятися від UTC, якщо зсув перетинає північ
```
**Пастки часових поясів**
```javascript
const d = new Date('2024-03-15'); // парситься як UTC опівночі
d.toISOString(); // '2024-03-15T00:00:00.000Z' — UTC
d.getDate(); // може повернути 14 у UTC-5! (локальний час — попередній день)
// Правило: UTC-методи для арифметики, toISOString() для серіалізації
```
**Арифметика дат**
```javascript
const start = new Date('2024-01-01');
const end = new Date('2024-03-15');
const diffMs = end - start; // 6393600000 мс
const diffDays = diffMs / (1000 * 60 * 60 * 24); // 74 дні
// Додати 7 днів до дати
const next = new Date(start);
next.setDate(next.getDate() + 7);
```
**Date.now() для вимірювання продуктивності**
```javascript
const t0 = Date.now();
doExpensiveWork();
console.log(`Зайняло ${Date.now() - t0} мс`);
```
replacer, reviver, toJSON() та structuredClone vs JSON-кругопоїздка
**replacer — фільтрація або перетворення при stringify**
Другий аргумент `JSON.stringify` може бути масивом ключів (білий список) або функцією, що викликається для кожної пари ключ/значення:
```javascript
const user = { name: 'Alice', password: 'secret', age: 30 };
// Масив-replacer — зберегти лише ці ключі
JSON.stringify(user, ['name', 'age']) // '{"name":"Alice","age":30}'
// Функція-replacer — перетворювати значення
JSON.stringify(user, (key, value) => {
if (key === 'password') return undefined; // пропустити чутливі поля
if (typeof value === 'number') return value * 2; // перетворити
return value;
});
// '{"name":"Alice","age":60}'
```
**reviver — перетворення при parse**
Другий аргумент `JSON.parse` викликається для кожного розпарсеного значення, зсередини назовні. Використовуй для конвертації рядків Date назад у Date-об'єкти:
```javascript
const iso = /^\d{4}-\d{2}-\d{2}T[\d:.]+Z$/;
function dateReviver(key, value) {
if (typeof value === 'string' && iso.test(value)) {
return new Date(value);
}
return value;
}
const json = '{"name":"Подія","date":"2024-03-15T00:00:00.000Z"}';
const obj = JSON.parse(json, dateReviver);
obj.date instanceof Date // true
obj.date.getUTCFullYear() // 2024
```
**toJSON() — налаштування серіалізації для класу**
Якщо об'єкт має метод `toJSON`, `JSON.stringify` викликає його і використовує результат:
```javascript
class Temperature {
constructor(celsius) { this.celsius = celsius; }
toFahrenheit() { return this.celsius * 9/5 + 32; }
toJSON() { return { celsius: this.celsius, unit: 'C' }; }
}
const temp = new Temperature(100);
JSON.stringify(temp) // '{"celsius":100,"unit":"C"}'
```
**structuredClone vs JSON-кругопоїздка**
```javascript
// JSON-кругопоїздка — просто, але втрачає не-JSON типи
const clone1 = JSON.parse(JSON.stringify(obj));
// Date стає рядком, undefined відкидається, Set стає {}
// structuredClone — зберігає Date, Map, Set, ArrayBuffer тощо
const clone2 = structuredClone(obj);
// Date залишається Date, Map залишається Map — але функції клонувати не можна
```
Використовуй `structuredClone` для загального глибокого клонування; JSON-кругопоїздку — лише коли знаєш, що дані сумісні з JSON.
Створіть об'єкт `Date` з рядка ISO '2024-03-15T14:30:00Z' і поверніть його UTC-рік, місяць (починаючи з 1) і день як об'єкт.
function parseIsoDate(isoStr) {
// Повернути { year, month, day } в UTC
}
const result = parseIsoDate('2024-03-15T14:30:00Z');
console.log(result.year); // 2024
console.log(result.month); // 3
console.log(result.day); // 15
Рішення
function parseIsoDate(isoStr) {
const d = new Date(isoStr);
return {
year: d.getUTCFullYear(),
month: d.getUTCMonth() + 1,
day: d.getUTCDate(),
};
}
Для масиву JSON об'єктів подій з полями 'date' (рядки ISO) поверніть подію з найновішою датою.
function latestEvent(jsonStr) {
// ваш код тут
}
const events = '[{"name":"Conf","date":"2024-09-12"},{"name":"Workshop","date":"2024-11-03"},{"name":"Meetup","date":"2024-07-20"}]';
console.log(latestEvent(events).name); // 'Workshop'
Рішення
function latestEvent(jsonStr) {
const events = JSON.parse(jsonStr);
return events.reduce((latest, e) => e.date > latest.date ? e : latest);
}
Для масиву об'єктів з методом `toJSON()` продемонструйте власну серіалізацію JSON: кожен об'єкт має серіалізуватися як `{ type, value }`, де type — назва класу.
class Temperature {
constructor(celsius) { this.celsius = celsius; }
toJSON() {
// ваш код тут — поверніть об'єкт для серіалізації
}
}
const temps = [new Temperature(100), new Temperature(0), new Temperature(37)];
const json = JSON.stringify(temps);
console.log(json);
// '[{"type":"Temperature","value":100},{"type":"Temperature","value":0},{"type":"Temperature","value":37}]'
Рішення
class Temperature {
constructor(celsius) { this.celsius = celsius; }
toJSON() {
return { type: this.constructor.name, value: this.celsius };
}
}
No split tab
Налаштування cookies
Ми використовуємо необхідні cookies для роботи сайту. З вашого дозволу ми також можемо зберігати налаштування сайту та використовувати аналітичні й рекламні cookies, щоб розуміти використання сайту й підтримувати розвиток проєкту.
* Ви завжди можете змінити свій вибір у налаштуваннях сайту.
Оберіть категорії cookies
Налаштування аналітики
Можна вимкнути аналітику використання платформи. Також можна надіслати в Google Analytics запит на видалення даних про використання цього сайту, пов'язаних із цим браузером.
Навчальний workspace
Навчайтеся, читаючи, запускаючи код і розв'язуючи задачі.
Практикуйте програмування з поясненнями тем, вправами, інструментами browser IDE, перевіркою regex і тренуванням друку коду в одному workspace.
Відкривайте інструменти у вкладках.Вправи, IDE-інструменти й тренажери залишаються доступними як вкладки сайту.
Перемикайтеся без втрати контексту.Переходьте між поясненнями, кодом та утилітами, зберігаючи своє місце.
Використовуйте sidebar як карту.Ліві панелі містять навігацію, налаштування, файли, libraries та керування інструментами.
PythonJavaScriptSQLite
Одна IDE, три практичні режими
Python у браузері.Запускайте невеликі скрипти, пробуйте бібліотеки й тренуйте API-запити без встановлення.
JavaScript для швидких експериментів.Перевіряйте код для браузера й порівнюйте ідеї поруч із навчальними матеріалами.
SQLite для практики з даними.Відкривайте оглядач бази даних, переглядайте таблиці, пишіть запити й вивчайте SQL локально.
ТемаIDE
Працюйте поруч у split tabs
Тримайте інструкції перед очима.Відкрийте вправу або довідкову сторінку поруч з IDE, замість постійних перемикань.
Порівнюйте інструменти під час навчання.Розміщуйте перевірки regex, пояснення та експерименти з кодом поруч, коли це потрібно для задачі.
Закрийте split, коли завершите.Workspace повернеться до однієї сфокусованої вкладки, а відкриті вкладки сайту залишаться доступними.
Тренажер друку коду
Або звичайного тексту
Тренажер розрахований на фізичну клавіатуру.Відкрийте цей розділ на ноутбуці або комп'ютері з широким екраном. На телефоні тренування друку не працюватиме коректно.
Швидкість: 0 зн/хв
0 слів/хв
Найкраща швидкість (60с): 0 зн/хв
0 слів/хв
Помилки: 0
Загальний час: 0.0 с
Щоб тренувати сліпий друк, не підглядайте на фізичну клавіатуру.