작업의 절반을 수행하는 많은 답변. 예, !!X
"X의 진실성 [부울로 표현됨]이라고 읽을 수 있습니다. 그러나 !!
실제로 말해서 단일 변수가 진실인지 거짓인지 알아내는 데 중요하지 않습니다. !!myVar === true
그냥 동일합니다 myVar
. 비교!!X
"실제"부울과 하는 것은 실제로 유용하지 않습니다.
당신이 얻는 !!
것은 서로에 대해 여러 변수의 진실성을 확인하는 능력입니다 것은 반복 가능하고 표준화 된 (그리고 JSLint 친화적 인) 방식 입니다.
단순히 캐스팅 :(
그건...
0 === false
입니다 false
.
!!0 === false
입니다 true
.
위의 내용은 그렇게 유용하지 않습니다. if (!0)
와 동일한 결과를 제공합니다 if (!!0 === false)
. 변수를 부울로 캐스트 한 다음 "참"부울과 비교하는 좋은 사례는 생각할 수 없습니다.
JSLint의 지시에 따라 "== 및! ="를 참조하십시오 (참고 : Crockford가 약간의 사이트를 이동하고 있습니다. 해당 링크는 어느 시점에서 죽기 쉽습니다).
== 및! = 연산자는 비교하기 전에 강제 변환을 수행합니다. '\ t \ r \ n'== 0이 참이기 때문에 이것은 나쁩니다. 유형 오류를 마스크 할 수 있습니다. JSLint는 ==가 올바르게 사용되고 있는지 확실하게 확인할 수 없으므로 == 및! =를 전혀 사용하지 않고 항상보다 안정적인 === 및! == 연산자를 사용하는 것이 가장 좋습니다.
값이 진실이거나 허위임을 신경 쓰는 경우 짧은 형식을 사용하십시오. 대신에
(foo != 0)
그냥 말해
(foo)
대신에
(foo == 0)
말하다
(!foo)
참고 일부 있다는 것을 직관적 경우 부울이 숫자로 캐스팅 될 것입니다 ( true
에 캐스팅 1
과 false
에 0
숫자로 부울을 비교할 때). 이 경우 !!
정신적으로 유용 할 수 있습니다. 다시, 이것은 부울이 아닌 것을 하드 타입의 부울과 비교하는 경우입니다. 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 jive 때문에 메시지 상자에 -1이 출력됩니다! cmd.exe 프롬프트에서 시도해보십시오! 그러나 WScript.echo(-1 == test())
여전히 0 또는 WScript를 제공합니다 false
. 멀리 봐 끔찍 해요
진실성 비교 :)
그러나 두 가지 가치가 있다면 동일한 진실성 / 거짓 성을 확인해야합니까?
우리가있는 척 myVar1 = 0;
하고 myVar2 = undefined;
.
myVar1 === myVar2
이다 0 === undefined
명백하게 거짓입니다.
!!myVar1 === !!myVar2
이다 !!0 === !!undefined
와 사실이다! 같은 진실성! (이 경우, 둘 다 "거짓의 진실성을가집니다".
따라서 실제로 "부울 캐스트 변수"를 사용해야하는 유일한 장소는 두 변수가 동일한 진실성을 갖는지 확인하는 상황이있는 것입니다 . 즉, 사용 !!
두 바르가 있는지 확인해야하는 경우 truthy 또는 둘 모두 falsy 모두 , (또는하지 않음), 동등의 (여부) truthiness .
나는 그 미손에 대한 유인되지 않은 훌륭한 유스 케이스를 생각할 수 없다. 양식에 "연결된"필드가 있습니까?
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
컬렉션 에 추가 오류가 발생해야합니다 .
2017 년 10 월 24 일, 2 월 19 일 편집 :
명시 적 부울 값이 필요한 타사 라이브러리
흥미로운 사례 !!
가 있습니다 ... 타사 라이브러리가 명시적인 부울 값을 기대할 때 유용 할 수 있습니다.
예를 들어, JSX (React)의 False는 단순한 허위로 유발되지 않는 특별한 의미 를 갖습니다. JSX에서 다음과 같은 것을 반환하려고 시도하면 int in messageCount
...
{messageCount && <div>You have messages!</div>}
... 메시지가 없을 0
때 React가 a를 렌더링하는 것을보고 놀랄 수도 있습니다 . JSX가 렌더링되지 않도록하려면 명시 적으로 false를 반환해야합니다. 위의 명령문은 0
JSX를 정상적으로 렌더링하는을 반환 합니다. 그것은 당신이하지 않았다 Count: {messageCount && <div>Get your count to zero!</div>}
(또는 덜 고안된 것을) 말할 수 없습니다 .
한 수정 강제 변환 방방, 관련 0
으로 !!0
인을 false
:
{!!messageCount && <div>You have messages!</div>}
JSX의 문서는 더 명확하고 자체 주석 코드를 작성하며 비교를 사용하여 부울로 강제합니다.
{messageCount > 0 && <div>You have messages!</div>}
나는 삼항으로 자신을 조작하는 것이 더 편합니다.
{messageCount ? <div>You have messages!</div> : false}
Typescript와 같은 거래 : 불리언을 반환하는 함수가 있거나 불리언 변수에 값을 할당하는 경우, 일반적으로 불리언 y 값을 반환 / 할당 할 수 없습니다. 강력하게 형식화 된 부울이어야합니다. 이것은 iff myObject
가 강력하게 입력 되고 return !myObject;
부울을 반환하는 함수 에는 작동하지만 return myObject;
그렇지 않은 것을 의미합니다. return !!myObject
Typescript의 기대치와 일치 해야합니다 .
Typescript의 예외? 경우 myObject
을했다 any
, 당신은 다시 자바 스크립트의 서부에있어,없이 반환 할 수 있습니다 !!
당신의 반환 형식이 부울 경우에도.
있다는 사실을 숙지 이러한 JSX & 타이프 라이터 규칙입니다 자바 스크립트가 아니라 고유의 것들 .
그러나 0
렌더링 된 JSX에 이상한 것이 있으면 허위 관리를 느슨하게 생각하십시오.