Может ли кто-нибудь объяснить этот код javascript, который я взял из веб-документов MDM?

#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;