[javascript] var 만 사용하여 JavaScript에서 부울 선언

다음과 같이 JavaScript 부울 변수를 선언하면 :

var IsLoggedIn;

그런 다음 true또는 로 초기화하면 1안전합니까? 아니면 초기화 1하면 변수가 숫자가 될까요?



답변

유형은 초기화에 따라 다릅니다.

var IsLoggedIn1 = "true"; //string
var IsLoggedIn2 = 1; //integer
var IsLoggedIn3 = true; //bool

그러나이 예를 살펴보십시오.

var IsLoggedIn1 = "true"; //string
IsLoggedIn1 = true; //now your variable is a boolean

변수 유형은 JavaScript에서 할당 된 값에 따라 다릅니다.


답변

아니 안전하지 않습니다. 나중에 var를 수행 할 수 IsLoggedIn = "Foo";있으며 JavaScript는 오류를 발생시키지 않습니다.

할 수 있습니다

var IsLoggedIn = new Boolean(false);
var IsLoggedIn = new Boolean(true);

부울이 아닌 변수를에 전달할 수도 있으며 new Boolean()IsLoggedIn을 부울로 만듭니다.

var IsLoggedIn = new Boolean(0); // false
var IsLoggedIn = new Boolean(NaN); // false
var IsLoggedIn = new Boolean("Foo"); // true
var IsLoggedIn = new Boolean(1); // true


답변

매우 유용한 튜토리얼 은 다음과 같이 말합니다.

var age = 0;

// bad
var hasAge = new Boolean(age);

// good
var hasAge = Boolean(age);

// good
var hasAge = !!age;


답변

당신이 원하는 경우 IsLoggedIn다음과 같이 초기화 할 필요가 부울로 취급 :

var IsLoggedIn=true;

로 초기화 var IsLoggedIn=1;하면 정수로 처리됩니다.

그러나 언제든지 변수 IsLoggedIn는 다른 데이터 유형을 참조 할 수 있습니다.

 IsLoggedIn="Hello World";

이것은 오류를 일으키지 않습니다.


답변

최소한 ‘정의’에 대해 초기화되지 않은 변수를 사용하고 테스트 있습니다 . 이렇게 :

var iAmNotDefined;
alert(!iAmNotDefined); //true
//or
alert(!!iAmNotDefined); //false

더구나 많은 가능성이 있습니다. 정확한 유형에 관심이 없다면 비교를 위해 ‘==’연산자 (또는! [변수] / !! [변수])를 사용하십시오 (이것이 Douglas Crockford가 ‘truthy’또는 ‘ 가짜라고 생각합니다). 이 경우 true 또는 1 또는 ‘1’을 단위 화 된 변수에 할당하면 요청시 항상 true가 반환됩니다. 그렇지 않으면 [유형 안전 비교가 필요한 경우] 비교를 위해 ‘===’를 사용하십시오.

var thisMayBeTrue;

thisMayBeTrue = 1;
alert(thisMayBeTrue == true); //=> true
alert(!!thisMayBeTrue); //=> true
alert(thisMayBeTrue === true); //=> false

thisMayBeTrue = '1';
alert(thisMayBeTrue == true); //=> true 
alert(!!thisMayBeTrue); //=> true
alert(thisMayBeTrue === true); //=> false
// so, in this case, using == or !! '1' is implicitly 
// converted to 1 and 1 is implicitly converted to true)

thisMayBeTrue = true;
alert(thisMayBeTrue == true); //=> true
alert(!!thisMayBeTrue); //=> true
alert(thisMayBeTrue === true); //=> true

thisMayBeTrue = 'true';
alert(thisMayBeTrue == true); //=> false
alert(!!thisMayBeTrue); //=> true
alert(thisMayBeTrue === true); //=> false
// so, here's no implicit conversion of the string 'true'
// it's also a demonstration of the fact that the 
// ! or !! operator tests the 'definedness' of a variable.

추신 : 존재하지 않는 변수에 대해서는 ‘정의성’을 테스트 할 수 없습니다. 그래서:

alert(!!HelloWorld);

참조 오류를 제공합니다 ( ‘HelloWorld가 정의되지 않았습니다’).

( ‘정의’에 대한 더 좋은 단어가 있습니까? 어쨌든 내 네덜란드어를 용서하십시오. ~)


답변

자바 스크립트의 변수에는 유형이 없습니다. 0이 아니고 널이 아니고 비어 있지 않으며 true“true”입니다. 0, null, 정의되지 않은 빈 문자열이며 false“false”입니다.

리터럴 truefalse.


답변

다음과 같은 것은 어떻습니까?

var MyNamespace = {
    convertToBoolean: function (value) {
        //VALIDATE INPUT
        if (typeof value === 'undefined' || value === null) return false;

        //DETERMINE BOOLEAN VALUE FROM STRING
        if (typeof value === 'string') {
            switch (value.toLowerCase()) {
                case 'true':
                case 'yes':
                case '1':
                    return true;
                case 'false':
                case 'no':
                case '0':
                    return false;
            }
        }

        //RETURN DEFAULT HANDLER
        return Boolean(value);
    }
};

그런 다음 다음과 같이 사용할 수 있습니다.

MyNamespace.convertToBoolean('true') //true
MyNamespace.convertToBoolean('no') //false
MyNamespace.convertToBoolean('1') //true
MyNamespace.convertToBoolean(0) //false

성능을 테스트하지는 않았지만 유형에서 유형으로 변환하는 일이 너무 자주 발생해서는 안됩니다. 그렇지 않으면 앱이 크게 불안정해질 수 있습니다!