Gernar
JavaScript: язык и типы

Какие знаешь методы итерации по массиву

Разбор вопроса «Какие знаешь методы итерации по массиву» для Frontend Developer: что проверяет интервьюер, ключевые тезисы, практические примеры и частые ошибки.

Вопрос

Какие знаешь методы итерации по массиву

Профессия

Frontend Developer

Что хочет услышать интервьюер

Интервьюер хочет убедиться, что кандидат знает не только базовые методы (forEach, map), но и более специализированные (reduce, some/every), а также понимает их различия и случаи применения. Важно показать, что вы разбираетесь в нюансах (например, for...in не рекомендуется для массивов).

Ключевые тезисы

  • Циклы: for, for...of, for...in (для массивов лучше избегать, так как он перебирает все enumerable свойства, включая прототипы).
  • Методы массива: forEach, map, filter, reduce, some, every, find, findIndex.
  • forEach — выполняет функцию для каждого элемента, не возвращает новый массив.
  • map — создает новый массив, применяя функцию к каждому элементу.
  • filter — возвращает новый массив с элементами, прошедшими проверку.
  • reduce — аккумулирует значения массива в одно значение.
  • some/every — проверяют, удовлетворяют ли элементы условию (хотя бы один/все).
  • find/findIndex — возвращают первый элемент/индекс, удовлетворяющий условию.
  • Дополнительно: entries(), keys(), values() для итерации с индексами или ключами.

Подробный ответ

В JavaScript существует множество способов итерации по массивам, которые можно разделить на три категории: классические циклы, методы массивов и специальные итераторы. Классические циклы (for, for...of) предоставляют базовый контроль над процессом итерации, но требуют больше кода. Методы массивов (forEach, map, filter и др.) являются более декларативными и удобными для большинства операций. forEach выполняет функцию для каждого элемента, но не возвращает новый массив, в отличие от map, который трансформирует каждый элемент и возвращает новый массив. filter создает новый массив с элементами, прошедшими проверку, а reduce аккумулирует значения в одно. Методы some и every проверяют условия (хотя бы один/все элементы), а find и findIndex ищут первый подходящий элемент или его индекс. for...in не рекомендуется для массивов, так как он перебирает все enumerable свойства, включая унаследованные, что может привести к неожиданным результатам.

Практические примеры

Пример 1

Пример использования map для трансформации массива:

const numbers = [1, 2, 3];
const doubled = numbers.map(num => num * 2);

// Результат: [2, 4, 6]

Пример 2

Пример использования reduce для суммирования:

const numbers = [1, 2, 3];
const sum = numbers.reduce((acc, num) => acc + num, 0);

// Результат: 6

Пример 3

Пример использования entries() для итерации с индексами:

const fruits = ['apple', 'banana', 'cherry'];
for (const [index, fruit] of fruits.entries()) {
  console.log(`${index}: ${fruit}`);
}

// Вывод: 0: apple, 1: banana, 2: cherry

Частые ошибки

  • Использование for...in для массивов, что может привести к перебору не только элементов, но и других свойств, если они были добавлены в прототип.
  • Использование forEach там, где нужен map, когда требуется создать новый массив на основе существующего.
  • Отсутствие начального значения в reduce, что может вызвать ошибки при работе с пустыми массивами.

Связанные темы

  • Иммутабельность и побочные эффекты в функциональном программировании
  • Цепочки методов массива (method chaining)
  • Итераторы и генераторы в JavaScript
  • Производительность различных методов итерации

Follow-up вопросы

В чем разница между forEach и map?

Уровень: basic

forEach просто перебирает элементы и выполняет функцию для каждого, но не возвращает новый массив. map создает и возвращает новый массив, применяя функцию к каждому элементу исходного массива.

Когда стоит использовать reduce, и можешь привести пример?

Уровень: intermediate

reduce полезен, когда нужно аккумулировать значения массива в одно значение. Например, суммирование чисел: [1, 2, 3].reduce((acc, num) => acc + num, 0) вернет 6.

Почему for...in не рекомендуется для массивов?

Уровень: intermediate

for...in перебирает все enumerable свойства объекта, включая унаследованные из прототипа, что может привести к неожиданным элементам в итерации. Для массивов лучше использовать for...of или методы массива.

Как работают методы some и every, и в чем их отличие?

Уровень: basic

some проверяет, удовлетворяет ли хотя бы один элемент условию, а every — все элементы. Оба возвращают boolean. Например, [1, 2, 3].some(x => x > 2) вернет true, а every — false.

Как можно использовать entries() для итерации по массиву с индексами?

Уровень: advanced

entries() возвращает итератор пар [индекс, значение]. Пример: for (const [index, value] of ['a', 'b'].entries()) { console.log(index, value); } выведет 0 'a' и 1 'b'.

Содержание