> Как реализовать возврат 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 должен вызываться с теми же аргументами, что и оригинал.
  • Метод должен быть иммутабельным (не изменять исходный массив).

Пример кода

JAVASCRIPT
if (!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 - защита от некорректных значений.

> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?

Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью