Что будет значением первого параметра в колбэке map при переборе массива
Что проверяют
Знаете ли вы сигнатуру колбэка map наизусть. Вопрос на полминуты, его задают в начале, чтобы отсеять тех, кто пишет код перебором вариантов, и чтобы зацепиться за продолжение про parseInt и разреженные массивы.
Как отвечать
Первый параметр это текущий элемент массива, его значение, а не индекс и не сам массив. Полная сигнатура такая:
arr.map(function (value, index, array) { return value; }, thisArg);То есть value это элемент, index его позиция, array исходный массив. Вторым аргументом самого map можно передать this для колбэка, но работает это только с обычной функцией: стрелочная берёт this из места объявления.
Дальше добавьте то, что отличает map от forEach: он возвращает новый массив той же длины, и элементом результата становится то, что вернул колбэк. Забыли return, получили массив из undefined, это самая частая опечатка при переходе от фигурных скобок к краткой стрелочной записи.
Полезно сказать и про разреженные массивы: пропуски колбэк не посещает, но в результате они сохраняются как пропуски, а не превращаются в undefined. Исходный массив map не меняет, хотя менять его внутри колбэка технически можно, и это верный способ получить неочевидное поведение.
Где спотыкаются
Классика с [1, 2, 3].map(parseInt), которая даёт 1, NaN, NaN. Второй параметр колбэка уходит в parseInt как основание системы счисления, и разбор двойки по основанию 1 невозможен. Лечится обёрткой, принимающей один аргумент.
Второе: используют map вместо forEach ради побочного эффекта. Получается неиспользуемый массив, и линтер справедливо ругается: если результат не нужен, перебирать надо другим методом.
Третье: ждут, что map дождётся асинхронных колбэков. Асинхронная функция возвращает промис, поэтому получится массив промисов, и его нужно передать в Promise.all, иначе дальше по коду окажутся не значения, а объекты ожидания.