> Как реализовать полифилл для Array.prototype.some с учетом callback и thisArg? (JavaScript)

Уровень: senior · Роль: frontend · Категория: Технические вопросы

Компании: Яндекс

Стек: JavaScript

> Пример ответа

Короткий ответ

Полифилл для Array.prototype.some реализуется через цикл по массиву с вызовом callback для каждого элемента, передавая thisArg как контекст через call или apply. Если callback возвращает true, цикл прерывается и возвращается true. Если ни один вызов не вернул true, возвращается false. Важно обработать случай пустого массива и проверить, что callback - функция.

Подробное объяснение

Array.prototype.some проверяет, удовлетворяет ли хотя бы один элемент массива условию, заданному в callback. Полифилл должен эмулировать поведение нативного метода, включая:

  • Вызов callback для каждого элемента с тремя аргументами: element, index, array.
  • Использование thisArg как контекста this внутри callback.
  • Прерывание выполнения при первом true.
  • Возврат false для пустого массива (так как ни один элемент не удовлетворяет условию).
  • Обработку разреженных массивов (sparse arrays) - callback не вызывается для отсутствующих элементов.

Реализация использует цикл for с проверкой наличия элемента через in оператор или hasOwnProperty, чтобы корректно обрабатывать дыры в массиве. thisArg передаётся через callback.call(thisArg, ...).

На практике

Полифилл для some редко нужен в современном коде, так как метод поддерживается во всех актуальных браузерах и средах (IE9+). Однако его реализация проверяет понимание:

  • Работы с контекстом (this) в JavaScript.
  • Итерации по массивам с учётом разреженности.
  • Принципов эмуляции нативных методов.
  • Оптимизации через ранний выход из цикла.

Полифилл обычно добавляют в сборку через babel/polyfill или core-js, но написание вручную демонстрирует глубокое знание языка.

Пример кода

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 и его сигнатуры. Затем объясни ключевые моменты реализации: проверку аргументов, обработку this, цикл с in для разреженных массивов, передачу thisArg через call. Упомяни, что length приводится к 32-битному беззнаковому целому через >>> 0 для соответствия спецификации. Подчеркни, что полифилл не должен изменять поведение для edge cases, например, при вызове на null или undefined.

Что проверяет интервьюер

  • Понимание спецификации ECMAScript для Array.prototype.some.
  • Умение работать с контекстом и this в JavaScript.
  • Знание особенностей массивов (разреженность, длина).
  • Навыки написания безопасного и совместимого кода.
  • Способность учитывать edge cases (пустой массив, не-массивы, не-функции).

Типичные ошибки

  • Пропуск проверки на null/undefined для this.
  • Использование for...of или forEach, которые не поддерживают ранний выход.
  • Игнорирование разреженных массивов (вызов callback для undefined элементов).
  • Неправильная передача thisArg (например, через callback.apply(thisArg, ...) без массива аргументов).
  • Забывание возвращать false по умолчанию.
  • Использование Array.prototype без проверки существования метода (может перезаписать нативный).

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

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