Как реализовать возврат true или false в полифилле some для прерывания перебора при первом true?
Что проверяют
Знаете ли вы семантику Array.prototype.some по спецификации, а не только «вернёт true, если нашёл». Главное здесь: выход из перебора делается через return внутри обычного цикла. Следом спрашивают про дырки в массиве, thisArg и поведение на пустом массиве.
Как отвечать
Каркас такой: for по индексам, при первом истинном результате колбэка сразу return true, после цикла return false. В forEach так не выйдет: return там завершает только текущий вызов колбэка, прервать перебор можно разве что исключением.
Детали, которые отличают хороший ответ:
thisи длина:const O = Object(this), длина берётся один раз до цикла. Элементы, которые колбэк добавит в массив по ходу, уже не посещаются;- проверка колбэка: если
typeof callback !== 'function', бросаетсяTypeError, причём ещё до перебора, даже на пустом массиве; - дырки: проверка
i in Oпропускает отсутствующие индексы в разреженном массиве вроде[1, , 3], но явно записанныйundefinedколбэк получит; - аргументы:
callback.call(thisArg, O[i], i, O), то есть элемент, индекс и сам массив; - приведение к булеву: колбэк может вернуть
1или непустую строку, метод всё равно вернётtrue, а не это значение; - пустой массив: результат
false, колбэк не вызывается ни разу; - установка:
Object.defineProperty(Array.prototype, 'some', { value: fn, writable: true, configurable: true }). По умолчаниюenumerableбудетfalse, и метод не всплывёт вfor...in.
Стоит заметить, что some есть в языке со времён ES5, так что сегодня это учебная задача, а не реальная потребность.
Где спотыкаются
Пишут через forEach и return true внутри колбэка. Функция возвращает undefined или всегда false, а перебор идёт до конца.
Объявляют метод стрелочной функцией. У стрелки нет своего this, и вместо массива внутри оказывается внешний контекст.
Присваивают Array.prototype.some = ... без проверки на существование. Нативный метод перетирается, а новое свойство становится перечисляемым и ломает чужие циклы for...in.