यह जाँचने के लिए कि टाइप बूलियन है या नहीं


269

अगर चर का प्रकार बुलियन का है तो मैं कैसे जांच सकता हूं?

मेरा मतलब है, कुछ विकल्प हैं जैसे:

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

लेकिन यह मुझे बहुत सुंदर नहीं लगता।

क्या इसे प्राप्त करने का एक क्लीनर तरीका है?


1
नहीं कर रहे हैं trueया falseप्रकार बूलियन की?
मत्तीस सीरो

1
आपको जांच करने की आवश्यकता नहीं है, आप ऐसा कर सकते हैं !!( ... some expression ...)और परिणाम एक बूलियन होगा।
कैलम लिन्गिंगटन

1
नहीं: trueऔर falseप्रकार के आदिम हैं boolean। पूंजी-बी बुलियन प्रकार बूलियन प्रिमिटिव के लिए एक वस्तु आवरण प्रकार है।
पॉंच

@CallumLinington जो बूलियन कंस्ट्रक्टर के साथ बनाई गई वस्तुओं के लिए काम नहीं करेगा :)
पॉइन्टी

1
@CallumLinington कोशिश करते हैं: if (new Boolean(false)) alert("hi");- एक पूंजी-बी बुलियन ऑब्जेक्ट हमेशा "सत्य" है, चाहे अंतर्निहित लिटिल-बी बुलियन मूल्य हो।
पॉइन्टी

जवाबों:


506

इसके लिए वही typeofहै। एक ऑपरेटर होने के बाद से कोष्ठक वैकल्पिक हैं ।

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

7
यह स्पष्ट नहीं है कि ओपी क्या करने की कोशिश कर रहा है, लेकिन पूंजी-बी बुलियन ऑब्जेक्ट "ऑब्जेक्ट" को उनके प्रकार के माध्यम से देते हैं typeof
पॉंच

14
1) typeofएक फ़ंक्शन नहीं है। 2) ट्रिपल ऑपरेटर का उपयोग करना === की typeofआवश्यकता नहीं है, क्योंकि यह हमेशा एक स्ट्रिंग (afaik, लेकिन जहाँ तक मुझे याद है, कुछ बहुत पुराने ब्राउज़रों के लिए एक और मामला था) लौटेगा। 3) typeofऔर स्ट्रिंग तुलना धीमी है। उनका उपयोग न करें। सीधे चेक करें (variable === true || variable === false)(मैं एक फ़ंक्शन लिखने का सुझाव देता हूं)।
स्टेनी

6
typeof(variable) === typeof(true)अधिक मजबूत नहीं होगा ?
मार्कस जुनियस ब्रूटस

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
यह मुझे बूलियन प्राइमेटिव और बूलियन ऑब्जेक्ट्स के समान व्यवहार करने के लिए बहुत व्यावहारिक नहीं लगता है, क्योंकि मैं उन्हें वैसे भी उपयोग नहीं कर सकता।
फेलिक्स क्लिंग

@FelixKling - मेरे लिए बहुत व्यावहारिक नहीं लगता है, लेकिन ऐसा लगता है कि ओपी यह निर्धारित करने की कोशिश कर रहा है कि क्या एक चर एक बूलियन है, यहां तक ​​कि जब भी बनाया जाता है new Boolean(), जो तकनीकी रूप से एक बूलियन नहीं है, लेकिन एक वस्तु है, लेकिन फिर भी धारण करता है एक बूलियन मूल्य।
एडेनो

मुझे लगता है कि ओपी को यह नहीं पता था कि new Boolean()एक वस्तु लौटाता है (प्रश्न पर टिप्पणी देखें)। लेकिन जो भी :)
फेलिक्स क्लिंग

@FelixKling - बस सवाल और टिप्पणियों को फिर से पढ़ना, और मैं अब देखता हूं कि ओपी मूल रूप से करने की कोशिश कर रहा है typeof variable === typeof new Boolean()और शायद बस एक नियमित टाइपोफ चेक चाहता है, लेकिन किसी तरह इसके बजाय कुछ अजीब jQuery वाक्यविन्यास में फंस गया।
एडीनो

आप अपने कोड को कितना लचीला बनाना चाहते हैं, इस पर निर्भर करता है कि अगर boolपरम में पारित हो जाता है null, typeof bool === 'object'तो अभी भी मूल्यांकन होगा और TypeError: Cannot read property 'valueOf' of nullकॉल पर एक अपवाद को फेंक दिया जाएगा typeof bool.valueOf()। इस प्रकार, मैं उस अंतिम पंक्ति को पढ़ने के लिए बदलूंगा: (typeof bool === 'object' && bool && typeof bool.valueOf() === 'boolean');जो केवल तभी मूल्यांकन करेगा जब boolवह अशक्त न हो
अल दास

34

शुद्ध जावास्क्रिप्ट के साथ , आप बस उपयोग कर सकते हैं typeofऔर ऐसा कुछ कर सकते हैं typeof falseया typeof trueयह वापस आ जाएगा"boolean" ...

लेकिन ऐसा करने का एकमात्र तरीका नहीं है, मैं नीचे अलग-अलग तरीके दिखाने के लिए फ़ंक्शन बना रहा हूं जिन्हें आप जांच सकते हैं बूलियन को जावास्क्रिप्ट में देख सकते हैं, विभिन्न तरीकों से आप इसे कुछ नए ढाँचों में भी कर सकते हैं, आइए इस से शुरू करें:

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

या एक-पंक्ति ईएस 6 रास्ता ...

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

और इसे कॉल करें!

isBoolean(false); //return true

मे भी अंडरस्कोर स्रोत कोड वे इस तरह यह जाँच (साथ _ समारोह नाम के शुरू में।):

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

यह किसी भी ढांचे का उपयोग करने के लिए अनुशंसित नहीं है क्योंकि यह वास्तव में जावास्क्रिप्ट में एक सरल जांच है।


असहमत: new Boolean(true) === new Boolean(true)झूठे वापस आना चाहिए (क्योंकि संदर्भ अलग हैं)। इसीलिए isBoolean(new Boolean(true))वसीयत झूठी होगी जबकि यह सच होनी चाहिए ( new Boolean(true)प्रकार की बूलियन है )।
एलेक्समेल्व

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 जब आप a बनाएंगे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विधि कुछ गेटर्स करती है और बहुत अंत में + 1 तुलना के अंदर तुलना करती है। यहाँ के लिए V8 संदर्भ है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;
}

Instof बूलियन मेरे लिए घोषित नहीं है।
डूडी

3

जावास्क्रिप्ट में चर के प्रकार की जांच करने का सबसे विश्वसनीय तरीका निम्नलिखित है :

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 trueरिटर्न "boolean"करते समय typeof new Boolean(true)रिटर्न "object"


"boolean"यदि मूल्य वास्तव में एक वस्तु है तो आप क्यों लौटना चाहेंगे ? यह मुझे बहुत व्यावहारिक नहीं लगता है। बूलियन ऑब्जेक्ट्स को वैसे भी बूलियन प्राइमेट से अलग तरीके से निपटा जाना है।
फेलिक्स क्लिंग

1
कोड साफ, सुंदर, या स्पष्ट नहीं है। नोट ओपी "इसे प्राप्त करने के लिए एक क्लीनर तरीका" के लिए पूछ रहा है।
स्पेंसर वाइकजोरक

मैं मानता हूं कि कोड साफ या सुंदर नहीं है, लेकिन AFAIK में कोई सुंदर और एक ही समय में विश्वसनीय विकल्प नहीं है अगर दृश्य में दोनों बूलियन प्राइमेटिव और बूलियन ऑब्जेक्ट हैं।
वलोडिमिर फ्रोलोव

यह ऐसा कुछ करने के लिए गंभीरता से ओवरकिल समाधान की तरह लगता है जो मूल रूप से किया जा सकता है।
ब्रैंडनस्क्रिप्ट 5


1

आप एक फ़ंक्शन बना सकते हैं जो typeofएक तर्क के लिए जांच करता है।

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

1

कभी-कभी हमें इसकी जांच करने के लिए एक ही तरीके की आवश्यकता होती है। टाइपो डेट आदि के लिए काम नहीं कर रहा है इसलिए मैंने इसे आसान बना दिया है

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

इसके अलावा , आदि के लिए Number, हमें अक्सर एक ही तरीके से प्रकार की जांच करने की आवश्यकता होती है ...StringBoolean


1

ऐसे कार्यों को बनाना isBooleanजिनमें typeof v === "boolean"लंबे समय तक ऑनलाइनर शामिल है, बहुत ही अनहोनी लगती है। मुझे आश्चर्य है कि लगभग हर कोई अपना खुद का फ़ंक्शन बनाने का सुझाव देता है। यह देशी प्रोटोटाइप के रूप में एक ही कैंसर लगता है।

  • आप उन्हें हर प्रोजेक्ट में शामिल करने की जरूरत है, जिसमें आप शामिल हैं
  • अन्य डेवलपर्स के पास अलग-अलग आदतें हो सकती हैं, या आपके फ़ंक्शन के स्रोत की जांच करने की आवश्यकता है, यह देखने के लिए कि आप किस चेक का उपयोग करते हैं, यह जानने के लिए कि आपके चेक के कमजोर बिंदु क्या हैं।
  • जब आप साइट पर कंसोल में एक लाइनर लिखने का प्रयास करेंगे, जो आपकी परियोजना से संबंधित नहीं है

बस याद है typeof v === "boolean"और यह सब है। अपने IDE में कोई टेम्पलेट जोड़ें, जो इसे तीन अक्षरों के शॉर्टकट से डाल सके और खुश रहे।


1
वैसे, यदि प्रदर्शन बहुत महत्वपूर्ण है, तो बूलियन मान की जांच करने के लिए एक फ़ंक्शन होने पर मेरे परीक्षणों में Node.js. पर इनलाइन (फॉर-लूप 100000000x) करने की तुलना में 10% अधिक समय लगता है। लेकिन सबसे बुरा विकल्प था v === true || v === false, जो के मामले में 2 सत्यापन करता है false। रैंकिंग: (1 - दोनों व्यावहारिक समान) typeof v === 'booleanऔर typeof v === typeof true, (2) isBoolean(v), (3) v === true || v === false
जपना

मैं इस बात से पूरी तरह असहमत हूं। अलग-अलग आदतें सटीक कारण हैं: मैंने कितनी बार बग का अनुभव किया है क्योंकि सभी ने चीजों को अलग-अलग तरीके से जांचा है? यदि आपके पास बूलियन मान की जांच करने के लिए एक जगह है, तो कोडबेस में अलग-अलग शैली की जांच के लिए बहुत बेहतर आईएमओ है। इस तरह के फ़ंक्शन के व्यवहार को लगातार बदलना भी बहुत आसान है।
लुकास मंज़के

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 :।

    स्पष्टीकरण:

    • [!!] डबल विस्मयादिबोधक मूल्य एक बूलियन में परिवर्तित करता है।
    • [===] सख्त समानता के लिए ट्रिपल बराबर परीक्षण: दोनों प्रकार (बूलियन) और मूल्य समान होना चाहिए।
    • यदि मूल मान एक बूलियन नहीं है, तो यह ट्रिपल बराबर परीक्षण पास नहीं करेगा। यदि यह बूलियन चर है, तो यह ट्रिपल बराबर परीक्षण (दोनों प्रकार और मूल्य के साथ) पास करेगा।

    टेस्ट:

    • !! ५ === ५ // असत्य
    • !! 'परीक्षण' === 'परीक्षण' // असत्य
    • चलो वैल = नई तारीख (); !! वैल === वैल // झूठी
    • !! सच === सच // सच
    • !! झूठी === झूठी // सच्ची

0

नोडज में नोड-बूलिफाइ का उपयोग करके हम आइसबुलियन () का उपयोग कर सकते हैं;

        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

क्या बूलियन रिटर्न केवल तभी सही है जब मूल्य बूलियन मूल्य है
रतन उदय कुमार

0

Es2015 तीर फ़ंक्शन के साथ एक और निर्णय

const isBoolean = val => typeof val === 'boolean';
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.