JS - есть ли случай, когда !! x и x не представляют одно и то же логическое значение

1

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

Это заставило меня задуматься, есть ли какие-либо случаи в javascript, где if (!!x) будет разрешать такое же условие, как if (x)?

Примечание: Я не говорю о !! x! == x, я имею в виду, что они представляют разные логические значения. Другими словами, существует ли ситуация, когда эти 2 выражения не будут иметь одинакового результата.

x ? true : false;
!!x ? true : false;
  • 1
    Как x = new Boolean(true) ?
  • 0
    Технически, если x = new Boolean(true) тогда !!x !== x . Однако и if (x) и if (!!x) будут иметь значение true .
Показать ещё 4 комментария
Теги:
boolean

3 ответа

1

Как уже было сказано, все значения ложны или правдивы, поэтому нет переменной 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

1

Нет, нет.

Каждое значение в JS либо ложно, либо правдиво:

  • почти все объекты правдивы
  • все числа ожидают, что 0 являются правдивыми
  • все строки ожидают, что пустая строка будет правдой
  • 0 - ложный
  • пустая строка - ложная
  • undefined и null являются ложными

!! expr превратит значение фальши в значение false и истинное значение true. Это, по сути, преобразование expr в логическое.

1

В случае, когда 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 не останавливался при первом тесте, если он действителен.

  • 0
    Это не совсем то, что я искал, я изменил вопрос, чтобы быть немного яснее
  • 0
    Ответ - нет, не может быть переменной x, в которой логическое значение !!x отличается от значения для x .

Ещё вопросы

Сообщество Overcoder
Наверх
Меню