Если утверждение рассматривает истину как ложь - PullRequest
1 голос
/ 08 января 2020

Я наткнулся на чрезвычайно странное происшествие в Javascript, из которого я не могу сделать голову или хвост.

Вот очень простое if утверждение:

let hours = 20;

Я поставил точку останова и установил hours = 0 в отладчике. Я проверяю !hours в отладчике, чтобы подтвердить, что результат true, и нажимаю продолжить, чтобы выполнить инструкцию if.

if (!hours) {
  console.log("Hours is false: " + hours);
} else {
  console.log("Hours is true: " + hours);
}

Ожидаемый результат для записи:

Часы ложны: 0

Фактический результат зарегистрирован:

Часы истинны: 0

enter image description here

^ Мышь находится над hours, поэтому текущее значение отображается

Это происходит только тогда, когда hours изначально было установлено в целое число, а затем установите 0 в отладчике. Есть ли у Javascript какое-то неясное правило о том, что истинные значения сохраняют свой статус даже после изменения?

Или это несоответствие между отладчиком и кодом (которое, если оно истинно, в основном нарушило бы точку консоли )?

С какой стати это происходит?

Ответы [ 5 ]

2 голосов
/ 08 января 2020

Установите этот флажок, откройте devtools и запустите фрагмент кода, измените значение области на 0 или введите в консоли часы = 0. Оба будут работать, проверяя его

Chrom версия: версия 79.0.3945.88 ( Официальная сборка) (64-битная версия)

let hours = 20;
debugger
if (!hours) {
  console.log("Hours is false: " + hours);
} else {
  console.log("Hours is true: " + hours);
}
0 голосов
/ 08 января 2020

Я поставил точку останова и установил в отладчике часы = 0.

И это, вероятно, источник путаницы. Если ваше «здесь» равно после , код проверял значение x, то изменение значения x не влияет на то, какая ветвь выполняется.

0 голосов
/ 08 января 2020
if (!hours) {
    console.log("Hours is false: " + hours);
} else {
    console.log("Hours is true: " + hours);
}

если часы = 1, то

часы - это истина: 1

или если часы = 0, то

часов ложь: 0

или если часы = 20, то

часы истинны: 20

0 голосов
/ 08 января 2020

Вы должны проверить тип данных:

typeof hours;

0, поскольку число возвращает false в операторе if, поэтому с! оно возвращает истину.

var number = 0;
if (number) console.log(true); else console.log(false);
output -> false
if (!number) console.log(true); else console.log(false);
output -> true

Понятно JS.

0 голосов
/ 08 января 2020

Вы тщательно проанализировали hours полученный?

!0 === false
!"0" === true
!parseInt("0") === false

Вы вычислили строку, как если бы она была целым числом?

"0" +  0  === "00"
 0  + "0" === 0
+"0" + 0  === 0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...