Не понимаю применение оператора?

function every(array, predicate) {
    for (let element of array) {
        if (!predicate(element))  return false;
    } return true;
}
console.log(every([1, 3, 5], n => n < 10));
console.log(every([2, 4, 16], n => n < 10));
console.log(every([], n => n < 10));

Не могу понять, если убрать оператор ! перед predicate, то средний вывод в консоль все равно будет false. Подскажите почему?


Ответы (2 шт):

Автор решения: Qwertiy

Потому что Законы де Моргана.

Исходный код:

код описание
for (let element of array) в массиве
return false не
if (...(element)) существует элемент,
!predicate(element) который не соответствует условию

твой вариант

код описание
for (let element of array) в массиве
return false не
if (...(element)) существует элемент,
predicate(element) который соответствует условию

что, очевидно, не является противоположным условием.

→ Ссылка
Автор решения: CrazyElf

Потому что это будет тоже самое, что, не меняя код функции, поменять условие предиката на противоположное.

Т.е. вместо:

console.log(every([2, 4, 16], n => n < 10));

Будет:

console.log(every([2, 4, 16], n => n >= 10));

Оба условия n < 10 и n >= 10 верны не для всех элементов массива, отсюда и false.

→ Ссылка