> Как реализовать полифилл для 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, но написание вручную демонстрирует глубокое знание языка.
Пример кода
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 и его сигнатуры. Затем объясни ключевые моменты реализации: проверку аргументов, обработку 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без проверки существования метода (может перезаписать нативный).
> Похожие задачи по frontend
В каком порядке выполняются console.log в JavaScript с учетом синхронности и микротасков?
Как реализовать возврат true или false в полифилле some для прерывания перебора при первом true?
Как использовать несколько потоков в JavaScript
Как записывать ошибки в массив по индексу, соответствующему индексу промиса в JavaScript?
> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?
Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью