Так много ответов выполняют половину работы. Да, !!X
можно было бы читать как «правду X (представленную как логическое)». Но !!
, по сути, не так важен для выяснения того, является ли одна переменная (или даже если многие переменные) правдивыми или ложными. !!myVar === true
совпадает с myVar
. Сравнение !!X
с «реальным» булевым не очень полезно.
То, что вы получаете с помощью !!
, - это возможность проверить правдивость нескольких переменных друг против друга (
То есть ...
0 === false
- [!!0 === false
is true
. Вышеприведенное не так полезно. if (!0)
дает вам те же результаты, что и if (!!0 === false)
. Не думайте о хорошем случае для приведения переменной в boolean, а затем в сравнении с «истинным» булевым.
См. «== и! =» из направления JSLint (примечание : Crockford немного перемещает свой сайт, эта ссылка может умереть в какой-то момент) для немного о том, почему:
Операторы == и! = Действительно применяют принуждение до сравнения. это плохо, потому что это приводит к тому, что значение «\ t\r\n» == 0 является истинным, что может маскировать ошибки типа. JSLint не может достоверно определить, правильно ли используется ==, поэтому лучше не использовать == и! = вообще и к способы используют более надежные операторы === и! ==.
Если вам все равно, что значение является правдивым или ложным, используйте короткую форму. Вместо
(foo != 0)
просто скажите
(foo)
и вместо
(foo == 0)
скажите
blockquote>(!foo)
Обратите внимание, что есть некоторые неинтуитивные случаи , где булев будет отбрасываться на число (
true
передается в1
иfalse
в0
) при сравнении булевых с a номер. В этом случае!!
может быть умственно полезным. Хотя, опять же, это случаи, когда вы сравниваете небулевое значение с жестким типизированным логическим выражением, которое является imo серьезной ошибкой.if (-1)
по-прежнему остается здесь.╔═══════════════════════════════════════╦═══════════════════╦═══════════╗ ║ Original ║ Equivalent ║ Result ║ ╠═══════════════════════════════════════╬═══════════════════╬═══════════╣ ║ if (-1 == true) console.log("spam") ║ if (-1 == 1) ║ undefined ║ ║ if (-1 == false) console.log("spam") ║ if (-1 == 0) ║ undefined ║ ║ Order doesn't matter... ║ ║ ║ ║ if (true == -1) console.log("spam") ║ if (1 == -1) ║ undefined ║ ╠═══════════════════════════════════════╬═══════════════════╬═══════════╣ ║ if (!!-1 == true) console.log("spam") ║ if (true == true) ║ spam ║ better ╠═══════════════════════════════════════╬═══════════════════╬═══════════╣ ║ if (-1) console.log("spam") ║ if (truthy) ║ spam ║ still best ╚═══════════════════════════════════════╩═══════════════════╩═══════════╝
И все становится еще сумасшедшим в зависимости от вашего двигателя. WScript, например, выигрывает приз.
function test() { return (1 === 1); } WScript.echo(test());
Из-за какой-то исторический джив Windows , который выведет -1 в поле сообщения! Попробуйте в командной строке cmd.exe и посмотрите! Но
WScript.echo(-1 == test())
все равно дает вам 0 или WScriptfalse
. Осмотрите. Это ужасно.Сравнение правды:)
Но что, если у меня есть два значения, мне нужно проверить равную правду / фальсификацию?
Представьте, что у нас есть
myVar1 = 0;
иmyVar2 = undefined;
.
myVar1 === myVar2
-0 === undefined
и, очевидно, неверно.!!myVar1 === !!myVar2
является!!0 === !!undefined
и правда! Та же правдивость! (В этом случае обе «имеют правдоподобие фальши».)Таким образом, единственное место, где вам действительно нужно использовать «логические переменные», было бы, если бы у вас была ситуация где вы проверяете, имеют ли обе переменные ту же правду, не так ли? То есть, использует
!!
, если вам нужно убедиться, что два vars являются правдивыми или ложными (или нет), то есть равной (или нет) правдоподобности.Я не могу придумать отличный, непринужденный случай использования для этого. Возможно, у вас есть «связанные» поля в форме?
if (!!customerInput.spouseName !== !!customerInput.spouseAge ) { errorObjects.spouse = "Please either enter a valid name AND age " + "for your spouse or leave all spouse fields blank."; }
Итак, теперь, если у вас есть правдивость как для , так и для фальшивого имени и возраста супруга, вы можете продолжить. В противном случае у вас есть только одно поле со значением (или очень ранним браком), и вам нужно создать дополнительную ошибку в вашей коллекции
errorObjects
.EDIT 24 Oct 2017:
Сторонние библиотеки, ожидающие явных булевых значений
Вот интересный случай ...
!!
может быть полезна, когда сторонние библиотеки ожидают явные булевские значения.Для instance, False в JSX (React) имеет особое значение , которое не срабатывает при простой ложности. Если вы попытались вернуть что-то вроде следующего в вашем JSX, ожидая int в
messageCount
...
{messageCount &&
You have messages!}... вы можете быть удивлены, увидев, что React render a
0
, когда у вас есть нулевые сообщения. Вы должны явно вернуть false для JSX не для рендеринга. Вышеприведенный оператор возвращает0
, который JSX радостно делает, как и должно. Он не может сказать, что у вас не былоCount: {messageCount &&
(или что-то менее надуманное).Get your count to zero!}
- Одно исправление включает в себя bangbang, который принуждает
0
к!!0
, который являетсяfalse
:{!!messageCount &&
You have messages!}- Документы JSX предлагают вам быть более ясными, писать код с комментариями и использовать сравнение, чтобы заставить логическое.
{messageCount > 0 &&
You have messages!}- Мне удобнее манипулировать ложностью с тройным -
{messageCount ?
You have messages!: false}Имейте в виду, что этот является соглашением JSX , а не один, присущий JavaScript.
Но если вы видите странные
0
s в вашем обработанном JSX, подумайте об управлении слабым фальшивом.