Как работает метод массива some?
Что проверяют
Знаете ли вы поведение some на краях: короткое замыкание, пустой массив, «дырки» и истинность вместо строгого true. Следом часто просят написать полифил или объяснить, чем some отличается от find, includes и every.
Как отвечать
arr.some(callback, thisArg) вызывает колбэк с аргументами (element, index, array) и возвращает true, как только колбэк вернул истинное значение. Остальные элементы после этого не проверяются, поэтому в худшем случае это O(n), а в удачном один вызов.
Детали, которые отличают хороший ответ:
- пустой массив: всегда
false, колбэк не вызывается. Уeveryна пустом массиве наоборотtrue; - истинность: результат колбэка приводится к булеву, так что вернуть
1или непустую строку тоже значит «нашли»; - разреженные массивы: для пропущенных индексов колбэк не вызывается;
- длина фиксируется до старта: элементы, добавленные во время обхода, не проверяются, а удалённые до своей очереди пропускаются;
- мутация: сам метод массив не меняет, но колбэк может, и так делать не стоит;
thisArg: работает только с обычной функцией, у стрелочнойthisлексический.
Уместно показать, где что выбирать. Нужно знать, есть ли конкретное значение, лучше includes: он короче и находит NaN, который indexOf и сравнение через === пропускают. Нужен сам элемент, это find. Нужно, чтобы условию отвечали все, это every. А some удобен и как способ прервать обход, чего в forEach сделать нельзя.
Где спотыкаются
Передают асинхронный колбэк: arr.some(async x => ...). Он возвращает промис, промис истинен, и на непустом массиве ответ всегда true. Нужен Promise.all с последующей проверкой.
Путают с includes и пишут arr.some(x => x === value) там, где хватило бы встроенного метода, или наоборот ищут объект через includes, забывая, что сравнение идёт по ссылке.
Не могут объяснить, почему [].some(...) даёт false, а [].every(...) даёт true, хотя это логика кванторов: на пустом множестве «хотя бы один» ложно, а «для всех» истинно.