Я пересматривал свой код, и я упал на несколько строк, где я использовал двойное отрицание в условиях if
.
Это заставило меня задуматься, есть ли какие-либо случаи в javascript, где if (!!x)
будет разрешать такое же условие, как if (x)
?
Примечание: Я не говорю о !! x! == x, я имею в виду, что они представляют разные логические значения. Другими словами, существует ли ситуация, когда эти 2 выражения не будут иметь одинакового результата.
x ? true : false;
!!x ? true : false;
Как уже было сказано, все значения ложны или правдивы, поэтому нет переменной x, такой как x! = !! x.
Однако, если вы x не переменная, но является логической единицей, такой как (a || b)
, существуют случаи, когда ваш еще не оцененный x не равен !! x.
Из документации MDN Javascript:
o5 = 'Cat' || 'Dog' // t || t returns "Cat"
o6 = false || 'Cat' // f || t returns "Cat"
Если вы оцениваете !('Cat' || 'Dog')
, возвращаемое значение будет false
, тогда вы получите !!('Cat' || 'Dog')
который, конечно же, вернет true
.
Так что да, в таком случае не только вы можете получить x !== !!x
; вы также можете получить x != !!x
Нет, нет.
Каждое значение в JS либо ложно, либо правдиво:
!! expr превратит значение фальши в значение false и истинное значение true. Это, по сути, преобразование expr в логическое.
В случае, когда x = NaN
, !!x
не равно x
. Вот тест:
var x = NaN;
if(!!x == x) {
console.log("!!x is equal to x");
} else if (!!x !== x) {
console.log("!!x is not equal to x");
}
Однако их логическое значение одно и то же, что означает, что они будут выполнять одинаково внутри логического теста. Таким образом, независимо от характера x, if(!!x)
совпадает с if(x)
, и, следовательно, каждый экземпляр if(!!x)
можно смело заменить на if(x)
;
var x = NaN;
if(!!x) {
console.log("True");
} else if(x) {
console.log("False");
}
var x = NaN;
if(x) {
console.log("True");
} else if(!!x) {
console.log("False");
}
Я сделал два фрагмента (один из которых я поменял тесты), чтобы оператор if не останавливался при первом тесте, если он действителен.
!!x
отличается от значения для x
.
x = new Boolean(true)
?x = new Boolean(true)
тогда!!x !== x
. Однако иif (x)
иif (!!x)
будут иметь значениеtrue
.