Как работает этот цикл?

Вот мой цикл.

for (let x = 0; x <= 5; x++) {
    if (!x % 2 == 0) console.log(x); 
}

В результате выводятся такие значения – 1, 2, 3, 4, 5. Не понимаю почему. Если, например взять тройку и подставить в if получится: 3 % 2 == 1. Получается единица - это true, впоследствии true переводится в false → для тройки не должно срабатывать console.log. Почему срабатывает?


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

Автор решения: Aziz Umarov

Так хотели

for (let x = 0; x <= 5; x++) {
    if (x % 2 == 0) console.log(x); 
}

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

Если взять единицу и подставить в иф, то получится не 1 % 2, а !1 % 2. Любое число, кроме 0 это true. Соответственно not-любоечисло это false. false это 0. Остаток от деления 0 на 2 равен 0, условие выполнено - выводим число.

Возможно, вы хотели написать не !x % 2 == 0, а !(x % 2) == 0. Или x % 2 == 0, в зависимости от того, какие числа хотите вывести - четные или нечетные.

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

Если расставить скобки в выражении !x % 2 == 0 с учётом приоритетов операций, то будет:

((!x) % 2) == 0

И тогда условие в if будет вычисляться так:

x    !x        !x%2    !x%2==0
0    true      1       false
1    false     0       true
2    false     0       true
3    false     0       true
4    false     0       true
5    false     0       true

Если при написании сложного выражения есть сомнения в приоритете операторов, то можно расставить скобки. Также на developer.mozilla.org есть большая табличка с приоритетами.

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

for (let x = 0; x <= 5; x++) {
    if (x % 2 === 0) console.log(x); 
}

Либо так для не парных чисел:

for (let x = 0; x <= 5; x++) {
    if (x % 2 !== 0) console.log(x); 
}

→ Ссылка