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


89

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

var IsLoggedIn;

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


27
그것은 정말로 당신이 의미하는 "안전하다"에 의존한다. 자바 스크립트에는 "안전"이 없다.
AnthonyWJones

답변:


165

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

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에서 할당 된 값에 따라 다릅니다.


1
부울 변수를 부울로 직접 선언하면 어떻게 될까요? 그 어떤 성능 improvment하게됩니다
murtaza.webdev

20

아니 안전하지 않습니다. 나중에 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

6
new Boolean (); 사용하지 마십시오. IsLoggedIn은 이러한 모든 상황에서 true로 평가됩니다 (예, new Boolean (false)가 true 임).
Miles

@Miles : new Boolean (false)는 거짓이 아닙니다.
jan

5
@jan : stackoverflow.com/a/8695363if (new Boolean(false)) alert ('wat') 참조
Miles

@Miles Incredible, as (new Boolean(false)).toString()) === "false", 링크 주셔서 감사합니다
jan

10

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

var age = 0;

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

// good
var hasAge = Boolean(age);

// good
var hasAge = !!age;

아마 진짜 설명이 없을 것입니다. 아무도 당신이 TL에 지정할 수있는 튜토리얼을 통해 빗 싶어, 귀하의 게시물에서 박사
Heimi

7

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

var IsLoggedIn=true;

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

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

 IsLoggedIn="Hello World";

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


5

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

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가 정의되지 않았습니다').

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


빈 문자열로 문자열 케이스를 다시 시도하고 싶을 수 있습니다 thisMayBeTrue = '';. 빈 문자열이 거짓이므로 동일한 결과를 얻지 못할 것입니다. "추신 : 존재하지 않는 변수에 대해서는 '정의성'을 테스트 할 수 없습니다." -물론 가능합니다 typeof HellowWorld === 'undefined'..
nnnnnn

2

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

리터럴 truefalse.


JS 변수 에는 정수 또는 문자열 만 보유하는 변수를 선언 할 수 없다는 의미에서 유형이 없지만 (다른 언어에서 발생하는 것처럼) 주어진 시간에 변수가 보유 하는 특정 은 항상 유형. 그리고 유형은 2 + 2vs 와 같은 간단한 예에서 볼 수 있듯이 중요 "2" + 2합니다. typeof연산자를 참조하십시오 .
nnnnnn

2

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

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

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


2
왜 반대표? 우리 모두가 혜택을 볼 수 있도록 설명해주십시오.
TruMan1 2015 년

1

변수는 할당 한 유형이됩니다. 처음에는입니다 undefined. 할당하면 'true'문자열이되고 할당하면 true부울이되고 할당하면 1숫자가됩니다. 후속 할당은 나중에 변수 유형을 변경할 수 있습니다.

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