Ваше недоразумение заключается в порядке выполнения логического выражения в условии `while(num <= 100 && num)`. Давайте разберём это подробнее.
1. **Проверка условия `num <= 100 && num`:**
- Это условие состоит из двух частей, которые соединены логическим оператором `&&` (логическое "И").
- Оператор `&&` работает таким образом, что если первая часть выражения (то есть `num <= 100`) возвращает `false`, вторая часть (то есть `num`) не проверяется. Это называется "ленивое" выполнение, так как JavaScript не будет проверять вторую часть, если уже выяснил, что первая часть не может сделать всё выражение истинным.
2. **Случай при нажатии "ОК" с вводом числа 0:**
- При вводе 0, `num` становится равным 0.
- Здесь проверяются обе части: `0 <= 100` — это `true`, но значение `num` (0) является "ложным" (falsy) значением. Таким образом, вы получаете `true && false`, что в целом возвращает `false`. Цикл продолжает выполняться.
3. **Случай при нажатии "Отмена":**
- Если вы нажимаете "Отмена", `num` становится `null`.
- При этой проверке: `null <= 100` возвращает `true`, но следующий шаг — это проверка `num`, которая возвращает `false` (так как `null` является ложным значением).
- В этом случае мы получаем `true && false`, что также возвращает `false`. Однако в двух частях условия, если первая часть возвращает `false` (что в случае 0 возвращало `false` в сумме с `num`), цикл останавливается.
Таким образом, цикл продолжает выполнять запрос после ввода 0, но заканчивается при нажатии "Отмена", потому что в условиях сравнения `num` становится `null`, что в итоге приводит к `false`.
Правильное понимание работы логических операторов в JavaScript играют ключевую роль в разборе этого поведения. Если вы хотите, чтобы цикл продолжался только при вводе значений больше 100 и останавливался при любом "ложном" значении (включая 0 и null), можно изменить условие:
```javascript
while (num !== null && num <= 100);
```
Таким образом, вы напрямую проверяете на `null` и гарантируете, что цикл завершится.