#javascript #callback #higher-order-functions
Вопрос:
Я понимаю все об этом коде (или, по крайней мере, я думал, что понял), за исключением того факта, что он включает число «2» в новом отфильтрованном массиве. Я знаю, что код должен возвращать все простые числа, но если (число % i == 0) { возвращает false}, не должно ли это сделать так, чтобы он пропускал число «2»?
const array = [-3, -2, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13];
function isPrime(num) {
for (let i = 2; num > i; i ) {
if (num % i == 0) {
return false;
}
}
return num > 1;
}
console.log(array.filter(isPrime)); // [2, 3, 5, 7, 11, 13]
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/filter
Ответ №1:
В for
цикле переменная i
начинается с 2
, и условие проверяет , выполняется ли num > i
, поэтому for
цикл никогда не выполняется, если num
равно 2
.
Однако 2
включается в конечный результат из-за заключительного утверждения return num > 1
(так 2
как больше, чем 1
).
Ответ №2:
Сейчас самое подходящее время начать знакомство с использованием отладчика. Используя отладчик, вы можете пошагово просматривать код по мере его выполнения, наблюдая за точным поведением во время выполнения и изменением значений переменных по мере выполнения каждой операции.
Когда вы сделаете это, вы заметите, что значение 2
этой строки кода никогда не будет достигнуто:
if (num % i == 0) {
Обратите внимание на условия в for
цикле:
for (let i = 2; num > i; i ) {
Поэтому, когда num
2
цикл никогда не вводится (потому num > i
false
что сразу), и управление переходит к следующей операции. И эта следующая операция возвращается true
:
return num > 1;