В последней версии кода here с подчеркиванием, на линии 211, который читаетТребуется ли это или (||) утверждение?
result || (result = iterator.call(context, value, index, list))) return breaker;
это или утверждение необходимо? Можно ли заменить
(result = iterator.call(context, value, index, list))) return breaker; // ?
result
изначально установлена в ложь, и есть больше нигде в коде, который изменяется, за исключением этой одной линии.
Обратите внимание, что оператор JavaScript или (||) возвращает первый операнд, если он правдивый, а второй операнд, если он ('он' является первым операндом) является ложным. Это прямо из Крокфорда, Хороших частей. Также отмечено, что || значения an или с правдой/ложью не соответствуют истинным/ложным значениям.
Вот весь метод воспроизведен из приведенной выше ссылке:
var any = _.some = _.any = function(obj, iterator, context) {
iterator || (iterator = _.identity);
var result = false;
if (obj == null) return result;
if (nativeSome && obj.some === nativeSome) return obj.some(iterator, context);
each(obj, function(value, index, list) {
if (result || (result = iterator.call(context, value, index, list))) return breaker;
});
return !!result;
};
Возможно, это для производительности? – NicoSantangelo
Эта функция, которая содержит команду if, выполняется несколько раз и работает с одинаковым значением результата. Впервые это будет неверно. – ctn
Результат сначала ложный, но может быть изменен на каждой итерации. Этот код предполагает, что результат будет изменен только один раз. Без || iterator.call будет выполняться на каждой итерации. – Tommi