> Как получить элементы массива внутри метода расширения массива в JavaScript (JavaScript)

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

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

Стек: JavaScript

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

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

Внутри метода расширения массива (например, добавленного через Array.prototype.myMethod) элементы массива доступны через this. this ссылается на сам массив, на котором вызван метод. Для итерации используйте стандартные конструкции: for, for...of, forEach или обращение по индексу this[i]. Важно помнить, что стрелочные функции не подходят для таких методов, так как они не имеют собственного this.

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

Методы расширения массива в JavaScript - это функции, добавляемые в Array.prototype. Когда такой метод вызывается на конкретном массиве, JavaScript автоматически устанавливает this равным этому массиву. Это ключевой механизм: this предоставляет доступ ко всем элементам и свойствам массива.

Для доступа к элементам можно использовать:

  • Прямое обращение по индексу: this[index]
  • Свойство this.length для определения количества элементов
  • Методы итерации: this.forEach(), this.map() и т.д.
  • Циклы: for (let i = 0; i < this.length; i++) или for (const item of this)

Важно учитывать контекст: если метод расширения определён как стрелочная функция, this будет захвачен из внешнего лексического окружения (например, глобального объекта или undefined в strict mode), что сделает метод бесполезным. Поэтому всегда используйте function declaration или function expression.

На практике

При реализации методов расширения следует:

  1. Убедиться, что this действительно является массивом (проверка через Array.isArray(this))
  2. Обрабатывать пустые массивы и граничные случаи
  3. Не мутировать исходный массив без необходимости (если метод не предназначен для этого)
  4. Возвращать результат, если метод должен быть иммутабельным

Пример типичного сценария: создание метода myFilter, который работает аналогично встроенному filter, но с дополнительной логикой.

Пример кода

JAVASCRIPT
// Правильное объявление метода расширения
Array.prototype.myForEach = function(callback) {
for (let i = 0; i < this.length; i++) {
callback(this[i], i, this);
}
};
// Доступ к элементам через this
Array.prototype.myMap = function(callback) {
const result = [];
for (let i = 0; i < this.length; i++) {
result.push(callback(this[i], i, this));
}
return result;
};
// Неправильно: стрелочная функция не работает
Array.prototype.wrongMethod = () => {
// this здесь не массив, а внешний контекст
console.log(this); // window или undefined
};
// Использование
const arr = [1, 2, 3];
arr.myForEach(item => console.log(item * 2)); // 2, 4, 6
const doubled = arr.myMap(x => x * 2); // [2, 4, 6]

Как отвечать на собеседовании

Начните с ключевого момента: this внутри метода расширения ссылается на массив. Объясните, что для доступа к элементам используются стандартные итерационные конструкции. Подчеркните важность использования обычных функций, а не стрелочных. Приведите пример простого метода расширения и покажите, как он работает. Упомяните проверку типа массива и обработку краевых случаев. Если спросят про производительность, отметьте, что цикл for быстрее forEach для больших массивов.

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

  • Понимание контекста this в JavaScript и его динамической природы
  • Знание прототипного наследования и работы с Array.prototype
  • Умение правильно реализовывать методы расширения с учётом всех нюансов
  • Способность избегать типичных ошибок, связанных с контекстом и мутациями
  • Понимание разницы между обычными и стрелочными функциями

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

  • Использование стрелочных функций для объявления методов расширения - this теряет связь с массивом
  • Забывают проверить, что this является массивом, что может привести к ошибкам при вызове на других объектах
  • Мутирование исходного массива без явного указания в документации метода
  • Неправильная обработка разреженных массивов (с пропущенными элементами)
  • Игнорирование свойства length при итерации, что может вызвать бесконечный цикл или ошибки
  • Предположение, что this всегда будет массивом, без учёта возможности вызова через call или apply с другим контекстом

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

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