> Как улучшить сигнатуру функции, чтобы избежать передачи undefined? (JavaScript)
Уровень: senior · Роль: frontend · Категория: Технические вопросы
Компании: Исходный Код
Стек: JavaScript
> Пример ответа
Короткий ответ
Основные подходы: использовать параметры по умолчанию (function foo(x = defaultValue)), явные проверки на undefined в теле функции, или перейти к объекту параметров с деструктуризацией и значениями по умолчанию. В TypeScript - строгая типизация и optional chaining. Для сложных случаев применяйте discriminated unions или перегрузку функций.
Подробное объяснение
Проблема передачи undefined возникает из-за динамической природы JavaScript и отсутствия строгой типизации. Основные причины: необязательные аргументы, неполные вызовы, legacy-код.
Способы решения:
-
Параметры по умолчанию (ES6):
function greet(name = 'Guest')-undefinedзаменяется на дефолтное значение. Не работает дляnull. -
Явные проверки:
if (arg === undefined) arg = default- даёт контроль, но загромождает код. -
Объект параметров:
function config({ host = 'localhost', port = 8080 } = {})- явно задаёт все поля, исключает неопределённые. -
TypeScript:
function foo(x?: string)- компилятор предупредит о возможномundefined. -
Перегрузка функций: разные сигнатуры для разных случаев.
-
Optional chaining и nullish coalescing:
const value = obj?.prop ?? 'default'- на стороне вызова.
Trade-off: параметры по умолчанию просты, но не решают проблему с null. Объект параметров лучше для множества опций, но требует больше boilerplate.
На практике
В реальных проектах комбинируйте подходы:
- Для простых функций с 1-2 опциональными аргументами - параметры по умолчанию.
- Для конфигураций и функций с 3+ параметрами - объект с деструктуризацией.
- В TypeScript - используйте
strictNullChecksи явные типы с| undefined. - Для критичных API - валидация на входе с выбрасыванием ошибки при
undefined.
Избегайте передачи undefined в цепочках вызовов - используйте ?? для подстановки значений по умолчанию на месте вызова.
Пример кода
JAVASCRIPT// Плохо: неявный undefinedfunction createUser(name, age) {// age может быть undefined}// Хорошо: параметры по умолчаниюfunction createUser(name, age = 18) {// age всегда число}// Лучше для сложных случаев: объект параметровfunction createUser({ name, age = 18, role = 'user' } = {}) {// все поля явные}// TypeScript с защитойfunction processData(input: string | undefined): void {const safeInput = input ?? 'default';}
Как отвечать на собеседовании
Начните с базовых параметров по умолчанию, затем переходите к объекту параметров для сложных случаев. Упомяните TypeScript и strict mode. Приведите пример из практики - как вы рефакторили функцию с 5+ опциональными аргументами. Подчеркните важность читаемости и предсказуемости кода.
Что проверяет интервьюер
- Понимание семантики
undefinedvsnullв JavaScript. - Знание современных возможностей языка (ES6+, TypeScript).
- Умение выбирать правильный паттерн под конкретную задачу.
- Навыки проектирования API функций.
- Понимание trade-off между гибкостью и строгостью.
Типичные ошибки
- Путать
undefinedиnull- они обрабатываются по-разному в параметрах по умолчанию. - Использовать параметры по умолчанию для всех случаев, включая обязательные аргументы.
- Забывать про дефолтное значение для всего объекта параметров (
= {}). - Переусложнять сигнатуру, когда достаточно простой проверки.
- Игнорировать TypeScript и полагаться только на runtime-проверки.
> Похожие задачи по frontend
Что происходит после выполнения микротасков в JavaScript и как обрабатываются макротаски и синхронный код?
Как модифицировать и отображать данные во frontend?
Как проходят таски в event loop
Как удалить дубликаты из массива чисел и строк без использования Set в JavaScript?
> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?
Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью