> Как реализовать возврат true или false в полифилле some для прерывания перебора при первом true? (JavaScript)
Уровень: senior · Роль: frontend · Категория: Технические вопросы
Компании: Яндекс
Стек: JavaScript
> Пример ответа
Короткий ответ
В полифилле Array.prototype.some прерывание при первом true реализуется через обычный цикл for или for...of с немедленным return true внутри условия. Использование forEach или map невозможно, так как они не поддерживают досрочный выход. Важно сохранить семантику: вызов callback с тремя аргументами (element, index, array), обработку пропущенных элементов в sparse arrays и корректную работу с thisArg.
Подробное объяснение
Метод some проверяет, удовлетворяет ли хотя бы один элемент массива условию, заданному в callback. Ключевое требование - остановка перебора сразу после первого true. Это оптимизация, предотвращающая лишние итерации. В нативном some это реализовано на уровне движка, а в полифилле - через ручной цикл.
Основные моменты:
- Цикл
forс проверкойi in arrayдля корректной обработки разреженных массивов (sparse arrays), где индексы могут отсутствовать. - Callback вызывается только для существующих элементов (проверка
hasOwnPropertyилиin). thisArgпередаётся черезcallилиapplyдля привязки контекста.- Если массив пуст или ни один элемент не прошёл проверку, возвращается
false.
На практике
Полифилл some часто требуется в legacy-коде или для поддержки старых браузеров (IE11). Важно не использовать forEach, map или reduce для реализации, так как они не поддерживают break. Также нельзя полагаться на throw для прерывания - это нарушает контракт метода и создаёт лишние накладные расходы.
При реализации стоит учитывать edge cases:
thisв callback должен бытьundefinedв strict mode, еслиthisArgне передан.- Callback должен вызываться с теми же аргументами, что и оригинал.
- Метод должен быть иммутабельным (не изменять исходный массив).
Пример кода
JAVASCRIPTif (!Array.prototype.some) {Array.prototype.some = function(callback, thisArg) {if (this == null) {throw new TypeError('Array.prototype.some called on null or undefined');}if (typeof callback !== 'function') {throw new TypeError(callback + ' is not a function');}const array = Object(this);const length = array.length >>> 0;for (let i = 0; i < length; i++) {if (i in array) {if (callback.call(thisArg, array[i], i, array)) {return true;}}}return false;};}
Как отвечать на собеседовании
Начни с краткого определения some и его поведения. Объясни, почему нельзя использовать forEach или map - они не поддерживают досрочный выход. Упомяни проверку i in array для sparse arrays и использование call для thisArg. Покажи пример кода и разбери его построчно. Подчеркни, что полифилл должен быть полностью семантически эквивалентен нативному методу. Если спросят про альтернативы, скажи, что for...of с break тоже подходит, но не даёт доступа к индексу без дополнительных усилий.
Что проверяет интервьюер
- Понимание работы итеративных методов массива и их внутреннего устройства.
- Умение реализовать полифилл с учётом всех edge cases (sparse arrays, thisArg, strict mode).
- Знание разницы между циклами и методами высшего порядка.
- Способность писать производительный и корректный код без лишних абстракций.
- Понимание контракта метода: callback вызывается только для существующих элементов, метод не мутирует массив.
Типичные ошибки
- Использование
forEachилиmap- они не поддерживают прерывание, что приводит к полному перебору массива. - Игнорирование sparse arrays - вызов callback для несуществующих индексов (например, через
for...ofбез проверки). - Забывание про
thisArg- callback должен вызываться с правильным контекстом. - Использование
throwдля прерывания - это антипаттерн, нарушающий семантику и производительность. - Неправильная обработка
nullилиundefinedв качестве массива - должно выбрасываться TypeError. - Отсутствие приведения
lengthк числу через>>> 0- защита от некорректных значений.
> Похожие задачи по frontend
Как упростить реализацию функции pipe, комбинирующей несколько функций в JavaScript?
В каком порядке выполняются console.log в JavaScript с учетом синхронности и микротасков?
Как реализовать полифилл для Array.prototype.some с учетом callback и thisArg?
Как использовать несколько потоков в JavaScript
> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?
Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью