if 문에서 부울


144

오늘 나는 학교 과제에서 변수가 참인지 거짓인지 확인하는 방법을 고려한 코드에 대해 언급했습니다.

내가 작성한 코드는 다음과 같습니다.

var booleanValue = true;

function someFunction(){
    if(booleanValue === true){
        return "something";
    }
}

그들은 다음과 같이 쓰는 것이 더 좋거나 더 좋다고 말했습니다.

var booleanValue = true;

function someFunction(){
    if(booleanValue){
        return "something";
    }
}

"=== true"부분에 대해 언급 한 내용은 필요하지 않으며 혼란을 야기 할 수 있다는 것입니다.

그러나 내 생각은 변수가 부울인지 아닌지를 확인하는 것이 좋습니다. 특히 Javascript는 느슨한 유형의 언어이기 때문입니다.

두 번째 예에서 문자열은 "something"도 반환합니다.

그래서 내 질문; 미래에 "=== true"부분을 느슨하게하는 것이 좋습니까? 아니면 변수 유형을 확인하는 것이 좋습니다.

편집 : 내 "실제"코드에서 부울은 이미지가 삭제되었는지 여부를 나타내므로 boolValue에 있어야 할 유일한 값은 true 또는 false입니다.

예를 들어 0과 1은 해당 변수에 없어야합니다.


4
=== 사용하는 것이 읽기 쉽고 좋습니다.
Piyas De

2
일에 대한 === true. 혼란을 피하십시오 !!
gashu

1
@gashu 고려 [0] === true는 거짓으로 평가됩니다.
RestingRobot

1
@Jlange해서는 안됩니까? 설명하십시오
gashu

내가 의미하는 바는, 단순히 "거친"존재를 확인하기를 원한다면, 그 진술은 참으로 평가되어야하지만 ([0]은 참으로 평가되지만 유형 변환 없이는 안된다), 그 진술은 실패 할 것입니다. 그것은 당신이 당신의 진술로 성취하려는 것에 달려 있습니다. === true조건이 정확히 같은지 확인해야 할 때 사용하십시오 true.
RestingRobot

답변:


222

우선, 사실 :

if (booleanValue)

포함 , 0이 아닌 숫자, 비어 있지 않은 문자열 값, 객체 또는 배열 참조 등의 if진실 된 값에 대한 진술을 충족시킵니다 .booleanValuetrue

반면에 :

if (booleanValue === true)

정확히 같으면 if조건 만 만족합니다 . 다른 어떤 진실한 가치도 그것을 만족시키지 못할 것입니다.booleanValuetrue

반면에 이렇게하면 :

if (someVar == true)

그런 다음 Javascript가 수행하는 작업은 유형 강제 변환 유형 true과 일치 someVar하고 두 변수를 비교하는 것입니다. 이것이 의도하지 않은 상황이 많이 있습니다. 이 때문에 대부분의 경우 ==Javascript가 두 가지 유형을 동일한 유형으로 강제 변환하는 방법에 대한 규칙이 상당히 길기 때문에 모든 규칙을 이해하고 JS 인터프리터가 수행 할 수있는 모든 것을 예상 할 수 없다면 두 개의 다른 유형 (대부분의 JS 개발자가 할 수없는)이 주어지면 ==완전히 피하고 싶을 것입니다 .

혼란스러운 예는 다음과 같습니다.

var x;

x = 0;
console.log(x == true);   // false, as expected
console.log(x == false);  // true as expected

x = 1;
console.log(x == true);   // true, as expected
console.log(x == false);  // false as expected

x = 2;
console.log(x == true);   // false, ??
console.log(x == false);  // false 

가치를 위해 2, 당신은 그것이 2진실한 가치 라고 생각할 것입니다. 그래서 그것은 유리하게 비교할 true것이지만, 그것은 유형 강요가 작동하는 방식이 아닙니다. 그것은 왼손 값의 유형과 일치하도록 오른손 값을 변환 하므로 true숫자 로 변환 1하므로 2 == 1확실히 의도하지 않은 것을 비교 하고 있습니다.

따라서 구매자는주의해야합니다. ==비교할 유형을 명시 적으로 알고 가능한 모든 유형 강제 알고리즘이 어떻게 작동하는지 알지 않는 한 거의 모든 경우 에 피하는 것이 가장 좋습니다 .


따라서 실제로 예상되는 값 booleanValue과 코드 작동 방식에 따라 다릅니다 . 미리 true또는 false값만 가질 것이라는 것을 미리 알고 있다면 명시 적으로

if (booleanValue === true)

추가 코드이며 불필요하며

if (booleanValue)

더 작고 틀림없이 더 깨끗합니다.

반면에, 당신이 무엇을 알지 못하고 다른 자동 유형 변환이 허용되지 않는지 booleanValue실제로 테스트하려는 경우 true,

if (booleanValue === true)

좋은 생각 일뿐만 아니라 필수입니다.


예를 들어, .on()jQuery 에서 구현을 살펴보면 선택적 반환 값이 있습니다. 콜백이을 반환 false하면 jQuery는 자동으로 이벤트 전파를 중지합니다. 이 특정 경우, jQuery false는 반환 된 경우에만 전파를 중지하려고하기 === false때문에 반환 값 명시 적을 원하지 undefined않거나 0또는 ""자동으로 false로 유형 변환하여 비교를 만족시키는 다른 항목을 확인합니다.

예를 들어 jQuery 이벤트 처리 콜백 코드는 다음과 같습니다.

ret = ( specialHandle || handleObj.handler ).apply( matched.elem, args );

if ( ret !== undefined ) {
     event.result = ret;
     if ( ret === false ) {
         event.preventDefault();
         event.stopPropagation();
     }
 }

jQuery가 명시 적으로 찾고 있음을 알 수 있습니다 ret === false.

그러나 jQuery 코드에는 코드의 요구에 따라 간단한 검사가 필요한 다른 곳도 많이 있습니다. 예를 들면 다음과 같습니다.

// The DOM ready check for Internet Explorer
function doScrollCheck() {
    if ( jQuery.isReady ) {
        return;
    }
    ...

나는이 질문에 대해 잠시 동안 생각했지만 물어볼 사람을 찾을 기회가 없었습니다. 당신이 볼 수 있다면 감사합니다. stackoverflow.com/questions/32615466/…
mmm

이 답변은 완전히 정확하지 않습니다. 'x == true'는 0이 아닌 숫자에 대해서는 참이 아닙니다.
Teemoh

@Teemoh-귀하의 의견을 이해하지 못합니다. jsfiddle.net/jfriend00/89h8d8tm을 참조하십시오 .
jfriend00

1
나는 당신이 대답의 첫 번째 단락에 쓴 것처럼 'if (x)'가 'if (x == true)'와 동일하지 않다고 말하고 싶습니다. 'if (x)'는 'x'를 부울 표현으로 명시 적으로 변환합니다. 'if (x == true)'는 EcmaScript Abstract Compare Algorithm을 사용합니다. 0이 아닌 숫자 또는 비어 있지 않은 문자열 또는 객체에 대해 'if (x == true)'가 true라고 썼습니다. 이것은 단지 잘못이다. 1 대신 2로 예제를 실행하면 작동하지 않습니다.
Teemoh

2
@ 티모-당신의 요점을 참조하십시오. 대답을 수정하고 명확히하고 예상치 못한 일을 수행하는 방법을 보여주는 예제와 함께 유형 강제에 대한 섹션을 추가했습니다.
jfriend00

40

다음과 같이 쓰면 if(x === true)x = true에 대해서만 참입니다.

을 쓰면 ''(빈 문자열), false, null, undefined, 0, NaN이 아닌 if(x)모든 x에 해당됩니다.


(빈 문자열), false, null, 정의되지 않음, 0, NaN
Oliboy50

잊지 마세요 NaN-0.
haykam

8

일반 "if"에서 변수는 부울로 강제되고 객체에서 toBoolean을 사용합니다.

    Argument Type   Result

    Undefined       false
    Null            false
    Boolean         The result equals the input argument (no conversion).
    Number          The result is false if the argument is +0, 0, or NaN;
                    otherwise the result is true.
    String          The result is false if the argument is the empty 
                    String (its length is zero); otherwise the result is true.
    Object          true.

그러나 ===과의 비교에는 유형 강제가 없으므로 강제없이 동일해야합니다.

객체가 부울이 아닐 수도 있다고 말하면 true / false 이상을 고려해야 할 수도 있습니다.

if(x===true){
...
} else if(x===false){
....
} else {
....
}

5

사용 사례에 따라 다릅니다. 유형도 확인하는 것이 합리적 일 수 있지만 플래그 일 경우에는 그렇지 않습니다.


===비교 유형 강제 변환을 수행하지 않습니다. 따라서 OP의 코드는 효과적으로 플래그 유형을 테스트합니다. 값이 부울이고 참인 경우에만 성공합니다.
Jesse Hallett

다시 말하겠습니다. 그것이 사실인지 거짓인지 알면 중요하지 않습니다.
Ven

5

일반적으로을 생략하는 것이 더 깨끗하고 간단합니다 === true.

그러나 Javascript에서는 이러한 문장이 다릅니다.

if (booleanValue)경우에 실행됩니다 booleanValue이다 truthy - 이외의 0, false, '', NaN, null,와 undefined.

if (booleanValue === true)booleanValue정확히 같은 경우에만 실행됩니다 true.


boolValue 만 true 또는 false로 설정하려는 경우에도 정확하게 확인하고 싶은 것입니다. 코드에서 변수가 true / false로 여러 번 설정됩니다. 코드를 작성할 때 1 년 후 코드를 다시 확인하면 모든 것을 올바르게 다시 읽지 않으면 큰 물음표가 표시됩니다.
DirkZz

@aldanux : 죄송합니다. 나는 의미했다 ''.
SLaks

4

아이덴티티 (===)연산자 (==)는 형식 변환이 수행되지 않은 것을 제외하고 는 항등 연산자와 동일하게 동작하며 형식이 동일하다고 간주되어야합니다.


마지막 문장이 잘못되었습니다. 두 문장을 시도 if (booleanValue)하고 if (booleanValue==true)언제 booleanValue입니다 2. 이 두 진술은 동일한 결과를 제공하지 않습니다.
jfriend00

흥미 롭군 나는 당신의 말을 받아 들일 것입니다. JS의 ObjC / C / C ++ 세계에서 JS의 데이터 유형이 변경 될 수 있고 2 = = true 인 경우 if를 수량화하지 않기 때문에 JS가 정확하다고 가정합니다.
Apollo SOFTWARE

1
이 구체적인 예는 위의 답변을 참조하십시오. 다른 유형의 두 값을 비교하기 위해 Javascript가 자동 유형 변환을 수행하는 방법과 관련이 있습니다.
jfriend00

3

체크 된 값은 Boolean코딩이 적을 때 직접 사용하는 것이 바람직하며 전혀 동일하지 않습니다.==true



2

변수가 부울 값만 사용할 수 있으면 더 짧은 구문을 사용하는 것이 합리적입니다.

그것은 잠재적으로 다른 유형을 할당하고 구별 할 수있는 경우 true에서 1또는 "foo", 당신은 사용해야합니다 === true.


2

나는 당신의 추론이 건전하다고 생각합니다. 그러나 실제로는 ===비교 를 생략하는 것이 훨씬 일반적이라는 것을 알았습니다 . 세 가지 이유가 있다고 생각합니다.

  1. 일반적으로 표현식의 의미에 추가되지는 않습니다. 즉, 값이 어쨌든 부울로 알려진 경우입니다.
  2. JavaScript에는 많은 유형 불확실성이 있기 때문에 예기치 않은 undefined또는 null가치 를 얻을 때 유형 검사를 강요하는 것이 당신을 문지르는 경향이 있습니다 . 이러한 경우 종종 테스트가 실패하기를 원합니다. (이보기를 "실패"모토와 균형을 맞추려고하지만).
  3. JavaScript 프로그래머는 유형, 특히 부울 식에서 빠르고 느슨하게 재생하는 것을 좋아합니다.

이 예제를 고려하십시오.

var someString = getInput();
var normalized = someString && trim(someString);  
// trim() removes leading and trailing whitespace

if (normalized) {
    submitInput(normalized);
}

이런 종류의 코드는 드문 일이 아니라고 생각합니다. 이 경우 핸들 getInput()반환 undefined, null또는 빈 문자열을. 두 개의 부울 평가로 인해 submitInput()주어진 입력이 공백이 아닌 문자를 포함하는 문자열 인 경우에만 호출됩니다.

JavaScript &&에서 첫 번째 인수가 거짓이면 첫 번째 인수를, 첫 번째 인수가 진실 인 경우 두 번째 인수를 리턴합니다. 정의되지 않은 경우도 마찬가지 normalized입니다 . 즉, 위의 부울 표현식에 대한 입력은 실제로 부울 값이 아닙니다.undefinedsomeString

필자는 이와 같은 코드를 볼 때 강력한 유형 검사 크리닝에 익숙한 많은 프로그래머가 있음을 알고 있습니다. 그러나 강력한 타이핑을 적용하려면 명시적인 검사 null또는 undefined값 이 필요할 수 있으므로 코드가 복잡해질 수 있습니다. JavaScript에서는 필요하지 않습니다.


1

이것은 다릅니다. 변수가 TRUE로 해석되는 것으로 우려되는 경우. 그렇다면 철저한 점검이 필수적입니다. 그렇지 않으면 그것은 당신에게 달려 있습니다. 그러나 구문 whatever == TRUE이 자신이하는 일을 알고있는 사람을 혼란스럽게 할 것 같지는 않습니다.


1

Javascript에서 부울 개념은 상당히 모호합니다. 이걸 고려하세요:

 var bool = 0 
 if(bool){..} //evaluates to false

 if(//uninitialized var) //evaluates to false

따라서 if 문 (또는 다른 제어문)을 사용하는 경우 "boolean"유형 var를 사용할 필요가 없습니다. 따라서 내 의견으로는, 부울임을 알고 있으면 진술의 "=== true"부분은 불필요하지만 값이 모호한 "거친"var 인 경우에는 반드시 필요합니다. javscript의 부울에 대한 자세한 내용은 여기를 참조하십시오 .



1

객체를 테스트해야하는 경우 부울 객체로 테스트 할 수도 있습니다. error={Boolean(errors.email)}

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.