유형이 부울인지 확인하는 방법


269

변수 유형이 부울 유형인지 어떻게 확인합니까?

내 말은, 다음과 같은 대안이 있습니다.

if(jQuery.type(new Boolean()) === jQuery.type(variable))
      //Do something..

그러나 그것은 나에게 예쁘지 않은 것 같습니다.

이것을 달성하는 더 깨끗한 방법이 있습니까?


1
부울 이 아니 true거나 false유형이 아닌가?
Matias Cicero

1
확인할 필요가 없습니다. 이렇게 !!( ... some expression ...)하면 결과가 부울이됩니다.
Callum Linington

1
번호 : truefalse유형의 기본 요소이다 boolean. 대문자 B 부울 유형은 부울 기본 요소의 오브젝트 랩퍼 유형입니다.
Pointy

@CallumLinington Boolean 생성자로 만든 객체에는 작동하지 않습니다 :)
Pointy

1
@CallumLinington try : if (new Boolean(false)) alert("hi");-기본 B 부울 값에 관계없이 대문자 B 부울 오브젝트는 항상 "거짓"입니다.
Pointy

답변:


506

그게 typeof거기에 있습니다. 괄호는 연산자 이므로 선택 사항 입니다.

if (typeof variable === "boolean"){
  // variable is a boolean
}

7
OP가 무엇을하려고하는지 명확하지 않지만 capital-B 부울 객체는를 통해 유형으로 "object"를 제공합니다 typeof.
Pointy

14
1) typeof기능이 아닙니다. 2) 트리플 연산자 ===를 사용하는 typeof것은 항상 문자열을 반환하기 때문에 필요하지 않습니다 (afaik이지만 기억하는 한 아주 오래된 브라우저가 있습니다). 3) typeof문자열 비교가 느립니다. 사용하지 마십시오. 직접 확인하십시오 (variable === true || variable === false)(함수를 작성하는 것이 좋습니다).
StanE

6
typeof(variable) === typeof(true)더 강력 하지 않을까요?
마커스 Junius Brutus

2
@TusharNiras은 name특정 함께 글로벌 윈도우 속성입니다 게터의 developer.mozilla.org/en-US/docs/Web/API/Window/name
자크 Lysobey

1
말도 안되는 @MarcusJuniusBrutus @AmitJoki typeof true대신에 더 자세한 정보 를 사용하는 데는 이점이 없습니다 "boolean". 새로운 버전의 ECMAScript는 절대로 변경되지 않습니다.
m93a

40

기본 값만 확인하려는 경우

typeof variable === 'boolean'

이상한 이유로 생성자로 생성 된 부울이있는 경우 실제로 부울이 아니지만 기본 부울 값을 포함하는 객체이며 기본 부울과 함께 생성 된 객체를 확인하는 한 가지 방법 new Boolean은 다음 과 같습니다.

function checkBool(bool) {
    return typeof bool === 'boolean' || 
           (typeof bool === 'object' && 
            bool !== null            &&
           typeof bool.valueOf() === 'boolean');
}


2
부울 프리미티브와 부울 객체를 같은 방식으로 처리하는 것은 실용적이지 않습니다. 어쨌든 같은 방식으로 사용할 수 없기 때문입니다.
Felix Kling

@FelixKling-나에게 실용적이지는 않지만 OP가 변수로 부울인지 확인하려고하는 것 같습니다. new Boolean()기술적으로 부울이 아니지만 개체이지만 부울 값
adeneo

OP new Boolean()가 객체 를 반환하는 것을 알지 못했다고 생각 합니다 (질문에 대한 의견 참조). 하지만 뭐든지 :)
Felix Kling

@FelixKling-질문과 의견을 다시 읽으면 OP가 기본적으로 수행하려고 typeof variable === typeof new Boolean()하고 정기적으로 유형 검사를 원하지만 이상한 jQuery 구문에 걸리게됩니다.
adeneo

경우, 당신은 당신의 코드를 만드는 방법을 탄력에 따라 bool전달 PARAM이었다 null(가) typeof bool === 'object'여전히 것이라고 평가하고 TypeError: Cannot read property 'valueOf' of null예외가 호출에 던져 질 것이다 typeof bool.valueOf(). 따라서 마지막 줄을 읽도록 변경합니다 . null 이 아닌(typeof bool === 'object' && bool && typeof bool.valueOf() === 'boolean'); 경우에만 평가됩니다 . bool
Al Dass

34

순수 자바 스크립트 , 그냥 간단하게 사용할 수 있습니다 typeof와 같은 무언가를 typeof false또는 typeof true그것을 반환합니다 "boolean"...

그러나 이것이 유일한 방법은 아닙니다. 아래의 함수를 작성 하여 JavaScript에서 부울 을 확인할 수있는 다양한 방법과 새로운 프레임 워크에서 수행 할 수있는 다른 방법을 보여줍니다 . 이것부터 시작하겠습니다.

function isBoolean(val) {
   return val === false || val === true;
}

또는 한 줄 ES6 방식 ...

const isBoolean = val => 'boolean' === typeof val;

그리고 그렇게 부르십시오!

isBoolean(false); //return true

또한 Underscore 소스 코드 에서 다음과 같이 확인합니다 (함수 이름 시작시 _. 사용).

isBoolean = function(obj) {
   return obj === true || obj === false || toString.call(obj) === '[object Boolean]';
};

또한 jQuery에서 다음과 같이 확인할 수 있습니다.

jQuery.type(true); //return "boolean"

반작용 , propTypes를 사용하는 경우, 당신은이 같은 부울로 값을 확인할 수 있습니다 :

MyComponent.propTypes = {
  children: PropTypes.bool.isRequired
};

사용하는 경우 타이프 라이터를 , 당신은 입력 사용할 수있는 부울 도 :

let isDone: boolean = false;

또한 그것을 수행하는 또 다른 방법은 값을 부울로 변환하고 값이 정확히 같은지 확인하는 것과 같습니다.

const isBoolean = val => !!val === val;

또는 같은 :

const isBoolean = val => Boolean(val) === val;

그리고 그것을 부르십시오!

isBoolean(false); //return true

JavaScript에서는 실제로 간단한 확인이므로 프레임 워크를 사용하지 않는 것이 좋습니다.


동의하지 않음 : new Boolean(true) === new Boolean(true)참조가 다르므로 false를 반환해야합니다. 그렇기 때문에 isBoolean(new Boolean(true))의지가 거짓 이어야하지만 new Boolean(true) 이 되어야 합니다 ( boolean 유형입니다 ).
AlexMelw

17

jQuery를 사용하거나 사용하지 않고이를 확인하는 세 가지 "바닐라"방법이 있습니다.

  1. 먼저 강제로 부울 평가를 수행 한 다음 원래 값과 같은지 확인하십시오.

    function isBoolean( n ) {
        return !!n === n;
    }
  2. 간단한 typeof확인하기 :

    function isBoolean( n ) {
        return typeof n === 'boolean';
    }
  3. 프리미티브에서 클래스 래퍼를 완전히 과도하고 불필요하게 인스턴스화합니다.

    function isBoolean( n ) {
        return n instanceof Boolean;
    }

세 번째는 클래스를 만들고 전달 하면 반환 true 됩니다new Boolean .

프리미티브 강제에 대해 자세히 설명하기 위해 (# 1 참조) 모든 프리미티브 유형을 다음과 같이 확인할 수 있습니다.

  • Boolean:

    function isBoolean( n ) {
        return !!n === n;
    }
  • Number:

    function isNumber( n ) {
        return +n === n;
    }
  • String:

    function isString( n ) {
        return ''+n === n;
    }

왜 유형 밀착이 "가장 최적"입니까? 보다 빠르거나 읽기 쉬운가 typeof? 나는 그것을 의심한다.
m93a

따라서 이론적으로 값을 부울로 강제 변환하면 1 강제 변환 + 2 비교 + 1 비교가 수행됩니다. 처음 두 비교는 강제 단계 동안 이루어지며 마지막 비교는 첫 번째 위치 (현재는 기본 위치)와 비교됩니다. 행동 typeof은 또한 1 강제이지만,이 typeof방법은 마지막에 몇 가지 getter와 비교 + 1 비교를 수행합니다. typeof
iSkore

1
결국, 두 방법 중 어느 것이나 너무 빠르며, 나노초의 차이가 너무 작아서 어느 쪽이 더 빠른지를 테스트하기조차 어려울 것입니다. 다음은 두 가지 JSPerf입니다. 하나 !!는 더 빠르다고, 하나 Boolean는 더 빠르다고 말합니다 . 테스트 사이에 델타가 얼마나 작은 지에 대한 참조. 부울 검사가 빠릅니다. jsperf.com/bool-not-not jsperf.com/bool-vs-doublenot
iSkore

나는 그 차이를 측정 할 수 없으며, 그러한 경우 AFAIK가 항상 먼저 가야하는 준비 상태에 동의합니다. 따라서 표준과 이해력 typeof val === "boolean"이 최적입니다.
m93a

1
예, 동의합니다. 가독성이 중요합니다. 운영자는 읽을 수 없습니다-업데이트 예정
iSkore

16

순수한 자바 스크립트를 사용하여이를 달성 할 수 있습니다.

var test = true;
if (typeof test === 'boolean')
   console.log('test is a boolean!');

7

함수가 부울 객체의 유효성을 검사하도록하려면 가장 효율적인 솔루션은 다음과 같아야합니다.

function isBoolean(val) {
  return val === false || val === true || val instanceof Boolean;
}

instanceof 부울이 나를 위해 선언되지 않았습니다.
Dudi

3

JavaScript에서 변수 유형을 확인하는 가장 신뢰할 수있는 방법 은 다음과 같습니다 .

var toType = function(obj) {
  return ({}).toString.call(obj).match(/\s([a-zA-Z]+)/)[1].toLowerCase()
}
toType(new Boolean(true)) // returns "boolean"
toType(true); // returns "boolean"

이 합병증의 원인은 typeof truereturn "boolean"typeof new Boolean(true)반환하기 때문 "object"입니다.


"boolean"값이 실제로 객체 인 경우 왜 반환 하시겠습니까? 그것은 실용적이지 않은 것 같습니다. 부울 객체는 어쨌든 부울 프리미티브와 다르게 처리해야합니다.
Felix Kling

1
코드가 깨끗하거나 예쁘거나 명확하지 않습니다. OP는 "보다 깨끗한 방법"을 요구하고 있습니다.
스펜서 Wieczorek

코드가 깨끗하지 않거나 예쁘지 않다는 데 동의하지만 AFAIK는 부울 프리미티브와 부울 객체가 모두 장면에있는 경우 예쁘고 동시에 신뢰할 수있는 옵션이 없습니다.
Volodymyr Frolov 17

이것은 기본적으로 수행 할 수있는 작업을 수행하는 심각한 과잉 솔루션 인 것 같습니다.
brandonscript


1

typeof인수 를 확인하는 함수를 작성할 수 있습니다 .

function isBoolean(value) {
  return typeof value === "boolean";
}

1

때때로 우리는 그것을 확인하는 단일 방법이 필요합니다. 날짜 등을 위해 작동하지 않는 typeof

Date.prototype.getType() { return "date"; }

또한 대한 Number, String, Boolean등 우리는 종종 하나의 방법으로 유형을 확인해야 ...


1

isBooleanoneliner를 포함하는 것과 같은 함수를 만드는 typeof v === "boolean"것은 장기적으로 매우 불편한 것처럼 보입니다. 나는 거의 모든 사람들이 자신의 기능을 만들 것을 제안합니다. 네이티브 프로토 타입을 확장하는 것과 같은 암인 것 같습니다.

  • 관련된 모든 프로젝트에서 다시 만들어야합니다
  • 다른 개발자가 다른 습관을 가지고 있거나 사용중인 수표의 적용을 확인하기 위해 기능의 소스를 확인해야 할 수도 있습니다.
  • 프로젝트에 속하지 않은 사이트의 콘솔에 하나의 라이너를 작성하려고 할 때 좌절합니다.

메모 만하면 typeof v === "boolean"됩니다. IDE에 템플릿을 추가하면 3 글자 바로 가기를 통해 행복해질 수 있습니다.


1
그런데 성능이 매우 중요하다면 부울 값을 확인하는 기능을 갖는 것이 Node.js에서 인라인 (for-loop 100000000x)하는 것보다 테스트에서 10 % 더 많은 시간이 걸렸습니다. 그러나 최악의 옵션은의 v === true || v === false경우 두 가지 검증을 수행했습니다 false. 순위 : (1-실용적으로 동일) typeof v === 'booleantypeof v === typeof true, (2) isBoolean(v), (3) v === true || v === false.
jpenna

나는 전적으로 이것에 동의하지 않습니다. 다른 습관이 정확한 이유는 다음과 같습니다. 모든 사람이 다르게 점검하여 버그를 얼마나 자주 경험 했습니까? 부울 값을 검사 할 장소가 한 곳이면 코드베이스 전체에서 다른 스타일 검사보다 IMO가 선호됩니다. 이러한 기능의 동작을 지속적으로 변경하는 것이 훨씬 쉽습니다.
Lucas Manzke

1
if(['true', 'yes', '1'].includes(single_value)) {
    return  true;   
}
else if(['false', 'no', '0'].includes(single_value)) {
    return  false;  
}

끈이 있다면


1
  • 가장 읽기 쉬운 : val === false || val === true.
  • 또한 읽을 수 있습니다 : typeof variable == typeof true.
  • 가장 짧지 만 읽을 수없는 부분 : !!val === val.

    설명:

    • [!!] 이중 느낌표 는 값을 부울로 변환합니다.
    • [===] 3 중 등가 엄격한 동등성 테스트 : 유형 (부울)과 값이 같아야합니다.
    • 원래 값이 부울 값이 아닌 경우 삼중 등가 테스트를 통과하지 않습니다. 부울 변수 인 경우 삼중 등가 검정을 통과합니다 (유형 및 값 모두).

    테스트 :

    • !! 5 === 5 // 거짓
    • !! 'test'=== 'test'// 거짓
    • let val = new Date (); !! val === val // 거짓
    • !! true === true // true
    • !! 거짓 === 거짓 // 참

0

nodejs에서 node-boolify 를 사용하여 isBoolean ();

        var isBoolean = require('node-boolify').isBoolean;
        isBoolean(true); //true
        isBoolean('true'); //true
        isBoolean('TRUE'); //false
        isBoolean(1); //true
        isBoolean(2); //false
        isBoolean(false); //true
        isBoolean('false'); //true
        isBoolean('FALSE'); //false
        isBoolean(0); //true
        isBoolean(null); //false
        isBoolean(undefined); //false
        isBoolean(); //false
        isBoolean(''); //false

값이 부울 값인 경우에만 부울 리턴이 true입니까
Ratan Uday Kumar

0

es2015 화살표 기능으로 한 가지 더 결정

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