Какие знаешь методы итерации по массиву
Разбор вопроса «Какие знаешь методы итерации по массиву» для 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'.
Возможно ли вызвать методы this у стрелочной функции
Разбор вопроса «Возможно ли вызвать методы this у стрелочной функции» для Frontend Developer: что проверяет интервьюер, ключевые тезисы, практические примеры и частые ошибки.
Что такое Event Loop? 😎
Event Loop связывает синхронный стек, очереди задач, микротаски и браузерные API. Вы разберете порядок выполнения, ловушки с промисами и таймерами, а также риск блокировки UI.