Какие аргументы принимает callback функция в методе some?
Что проверяют
Базовое знание API массивов и то, как вы о нём рассуждаете: короткое замыкание, пустые слоты, возвращаемое значение. Следом часто просят сравнить some с every, find и includes или написать полифил.
Как отвечать
Array.prototype.some(callback, thisArg) возвращает true, как только callback вернул истинное значение хотя бы для одного элемента, иначе false. Callback получает три аргумента:
- element: текущий элемент;
- index: его индекс;
- array: сам массив, на котором вызван
some.
Второй аргумент самого some, thisArg, задаёт this внутри callback. Со стрелочной функцией он бесполезен, у неё лексический this.
Поведение, которое стоит назвать:
- короткое замыкание: обход останавливается на первом
true, остальные элементы callback не видит. Поэтому побочным эффектам вsomeне место; - пустой массив: результат
falseпри любом условии, аeveryна пустом массиве вернётtrue; - дырявые массивы: пропущенные слоты (
[1, , 3]) не обходятся, callback для них не вызывается; - истинность: результат callback приводится к boolean, вернуть можно и объект, и число;
- изменения по ходу: элементы, добавленные в массив после начала обхода, не проверяются.
Практический пример: cart.some(item => item.qty > item.stock), чтобы понять, можно ли оформить заказ. Для поиска самого элемента нужен find, для проверки наличия примитива проще includes, он к тому же находит NaN.
Сигнатура (element, index, array) общая для forEach, map, filter, every и find, так что ответ стоит обобщить. Исключение reduce: у него первым аргументом идёт аккумулятор.
Где спотыкаются
Передают callback по ссылке, не глядя на его сигнатуру, и забывают, что вторым аргументом придёт индекс. Классика: ['1', '2', '3'].map(parseInt) даёт [1, NaN, NaN].
Путают поведение на пустом массиве и уверенно отвечают, что [].some(...) вернёт true.
Пишут callback в фигурных скобках и забывают return. Стрелка тогда возвращает undefined, some всегда отдаёт false, а ошибку ищут в условии.