**Создание объектов 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 roundtrip
**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 roundtrip**
```javascript
// JSON roundtrip — просто, но теряет не-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 roundtrip — только когда знаешь, что данные совместимы с 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 с
Для активации режима слепого набора не подсматривайте на физическую клавиатуру.