Вычисляйте возраст по календарным годам и дате дня рождения, а не по числу миллисекунд. Будущая дата рождения не даёт обычного возраста: ниже для неё явно возвращается null.
Создание функции для расчёта возраста через Function Expression
Вычисляйте возраст по календарным годам и дате дня рождения, а не по числу миллисекунд. Будущая дата рождения не даёт обычного возраста: ниже для неё явно возвращается null.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Реализуйте функцию getAge(), принимающую в качестве аргумента дату рождения и возвращающую вычисленный возраст. Функция должна быть объявлена при помощи Function Expression. Пример использования:
const calculateAge = function(birthDate) {
// реализация
};
const age = calculateAge(new Date('1990-05-15'));
console.log(age); // выводит текущий возраст
Функция должна корректно работать с датами как в прошлом, так и в будущем, учитывая високосные годы.
Ответ
Вычисляйте возраст по календарным годам и дате дня рождения, а не по числу миллисекунд. Будущая дата рождения не даёт обычного возраста: ниже для неё явно возвращается null.
const calculateAge = function (birthDate, today = new Date()) {
if (!(birthDate instanceof Date) || Number.isNaN(birthDate.getTime()) || Number.isNaN(today.getTime())) {
throw new TypeError('Некорректная дата');
}
const birth = [birthDate.getUTCFullYear(), birthDate.getUTCMonth(), birthDate.getUTCDate()];
const current = [today.getUTCFullYear(), today.getUTCMonth(), today.getUTCDate()];
const beforeBirthday = current[1] < birth[1] || (current[1] === birth[1] && current[2] < birth[2]);
const age = current[0] - birth[0] - Number(beforeBirthday);
return age < 0 ? null : age;
};
Выбран календарь UTC, чтобы дата из '1990-05-15' не сдвигалась на предыдущий день в отрицательной зоне. Для 29 февраля в невисокосный год возраст увеличивается 1 марта. Если нужны отрицательные значения или иной договорный день, это следует определить отдельно.