So überprüfen Sie, ob der Typ Boolean ist

268

Wie kann ich überprüfen, ob der Typ einer Variablen vom Typ Boolean ist?

Ich meine, es gibt einige Alternativen wie:

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

Aber das scheint mir nicht schön zu sein.

Gibt es einen saubereren Weg, um dies zu erreichen?

Matias Cicero
quelle
1
Sind nicht trueoder falsevom Typ Boolean?
Matias Cicero
1
Sie müssen nicht überprüfen, Sie können dies tun !!( ... some expression ...)und das Ergebnis wird ein Boolescher Wert sein.
Callum Linington
1
Nein: trueund falsesind Grundelemente vom Typ boolean. Der Boolesche Typ Capital-B ist ein Objekt-Wrapper-Typ für Boolesche Grundelemente.
Pointy
@ CallumLinington, das nicht für Objekte funktioniert, die mit dem Booleschen Konstruktor erstellt wurden :)
Pointy
1
@ CallumLinington-Versuch: if (new Boolean(false)) alert("hi");- Ein Boolesches Objekt in Großbuchstaben B ist immer "wahr", unabhängig vom zugrunde liegenden Booleschen Wert in Little-B.
Pointy

Antworten:

504

Dafür gibt typeofes da. Die Klammern sind optional, da es sich um einen Operator handelt .

if (typeof variable === "boolean"){
  // variable is a boolean
}
Amit Joki
quelle
7
Es ist nicht klar, was das OP versucht, aber Boolesche Objekte in Großbuchstaben B geben "Objekt" als Typ über an typeof.
Pointy
14
1) typeofist keine Funktion. 2) Die Verwendung des Triple-Operators === with typeofist nicht erforderlich, da immer eine Zeichenfolge zurückgegeben wird (afaik, aber soweit ich mich erinnere, gab es für einige sehr alte Browser einen anderen Fall). 3) typeofund String-Vergleiche sind langsam. Benutze sie nicht. Überprüfen Sie direkt mit (variable === true || variable === false)(ich schlage vor, eine Funktion zu schreiben).
StanE
6
wäre nicht typeof(variable) === typeof(true)robuster?
Marcus Junius Brutus
2
@TusharNiras nameist eine globale Fenstereigenschaft mit einem speziellen Getter Entwickler.mozilla.org/en-US/docs/Web/API/Window/name
Zach Lysobey
1
@MarcusJuniusBrutus @AmitJoki das ist Unsinn, es ist kein Vorteil, mehr wortreich typeof truestatt zu verwenden "boolean". Neue Versionen von ECMAScript werden niemals wichtige Änderungen erfahren.
M93a
40

Wenn Sie nur nach einem primitiven Wert suchen möchten

typeof variable === 'boolean'

Wenn Sie aus irgendeinem seltsamen Grund Boolesche Werte mit dem Konstruktor erstellt haben, handelt es sich nicht wirklich um Boolesche Werte, sondern um Objekte, die einen primitiven Booleschen Wert enthalten. Eine Möglichkeit, nach primitiven Booleschen Werten und Objekten zu suchen, die mit erstellt wurden, new Booleanbesteht darin, Folgendes zu tun:

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

Adeneo
quelle
2
Es erscheint mir nicht sehr praktisch, Boolesche Grundelemente und Boolesche Objekte als gleich zu behandeln, da ich sie sowieso nicht auf die gleiche Weise verwenden kann.
Felix Kling
@FelixKling - scheint mir auch nicht sehr praktisch zu sein, aber es scheint, als würde das OP versuchen festzustellen, ob eine Variable ein Boolescher new Boolean()Wert ist , selbst wenn sie mit erstellt wurde , was technisch gesehen kein Boolescher Wert ist, sondern ein Objekt, aber dennoch gültig ist ein boolescher Wert.
Adeneo
Ich denke, das OP wusste einfach nicht, dass new Boolean()ein Objekt zurückgegeben wird (siehe Kommentare zur Frage). Aber was auch immer :)
Felix Kling
@FelixKling - Lesen Sie einfach die Frage und die Kommentare noch einmal durch, und ich sehe jetzt, dass das OP im Grunde versucht, dies zu tun, typeof variable === typeof new Boolean()und wahrscheinlich nur eine regelmäßige Überprüfung wünscht, aber irgendwie in eine seltsame jQuery-Syntax verwickelt ist.
Adeneo
Je nachdem , wie robust Sie Ihren Code machen, wenn die boolparam übergeben war nulldas typeof bool === 'object'würde immer noch zu bewerten und eine TypeError: Cannot read property 'valueOf' of nullAusnahme wäre auf den Anruf zu werfen typeof bool.valueOf(). So würde ich das letzte Zeile zu lesen , ändern: (typeof bool === 'object' && bool && typeof bool.valueOf() === 'boolean');die nur evaluieren , wenn boolist nicht null.
Al Dass
34

Mit reinem JavaScript können Sie einfach typeofetwas wie typeof falseoder verwenden typeof trueund es wird zurückkehren "boolean"...

Aber das ist nicht die einzige Möglichkeit, dies zu tun. Ich erstelle Funktionen unten, um verschiedene Möglichkeiten aufzuzeigen, wie Sie in JavaScript nach Booleschen Werten suchen können, und auch verschiedene Möglichkeiten, wie Sie dies in einigen neuen Frameworks tun können. Beginnen wir mit dieser:

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

Oder einzeiliger ES6- Weg ...

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

und nenne es wie!

isBoolean(false); //return true

Auch im Unterstrich- Quellcode überprüfen sie dies folgendermaßen (mit dem _ am Anfang des Funktionsnamens):

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

Auch in jQuery können Sie dies folgendermaßen überprüfen:

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

Wenn Sie in React propTypes verwenden, können Sie überprüfen, ob ein Wert wie folgt boolesch ist:

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

Wenn Sie TypeScript verwenden , können Sie auch den Typ Boolean verwenden :

let isDone: boolean = false;

Eine andere Möglichkeit besteht darin, den Wert in einen Booleschen Wert umzuwandeln und zu prüfen, ob er immer noch genau derselbe ist.

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

oder wie:

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

und nenn es!

isBoolean(false); //return true

Es wird nicht empfohlen, dafür ein Framework zu verwenden, da es sich wirklich um eine einfache Überprüfung in JavaScript handelt.

Alireza
quelle
Nicht einverstanden: new Boolean(true) === new Boolean(true)sollte false zurückgeben (da die Referenzen unterschiedlich sind). Deshalb isBoolean(new Boolean(true))sagt der Wille falsch, während er wahr sein muss ( new Boolean(true)vom Typ boolean ).
AlexMelw
17

Es gibt drei "Vanille" -Möglichkeiten, um dies mit oder ohne jQuery zu überprüfen.

  1. Zuerst müssen Sie die boolesche Auswertung durch Zwang erzwingen und dann prüfen, ob sie dem ursprünglichen Wert entspricht:

    function isBoolean( n ) {
        return !!n === n;
    }
    
  2. Eine einfache typeofÜberprüfung durchführen:

    function isBoolean( n ) {
        return typeof n === 'boolean';
    }
    
  3. Einen völlig übertriebenen und unnötigen Instanziierung eines Klassen-Wrappers auf einem Primativ durchführen:

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

Der dritte wird nur zurückgegeben, true wenn Sie eine new BooleanKlasse erstellen und diese übergeben.

Um den Zwang der Primitiven (wie in Nr. 1 gezeigt) zu erläutern, können alle Primitivtypen auf folgende Weise überprüft werden:

  • Boolean::

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

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

    function isString( n ) {
        return ''+n === n;
    }
    
iSkore
quelle
Warum ist die Typenzusammensetzung "am optimalsten"? Ist es schneller oder besser lesbar als typeof? Ich bezweifle es stark.
M93a
Theoretisch führt das Erzwingen des Werts zu einem Booleschen Wert zu 1 Zwang + 2 Vergleichen + 1 Vergleich. Die ersten beiden Vergleiche finden während der Zwangsschritte statt, und der letzte Vergleich erfolgt gegen die erste Position (die jetzt ein Grundelement ist). Tun typeofist auch 1 Zwang, aber die typeofMethode macht ein paar Getter und Vergleiche innerhalb von + 1 Vergleich ganz am Ende. Hier ist die V8-Referenz fürtypeof
iSkore
1
Schließlich ist jede Methode so verdammt schnell, dass der Unterschied in Nanosekunden so gering ist, dass es schwierig ist, herauszufinden, welche Methode schneller war. Hier sind zwei JSPerfs. Man sagt !!ist schneller, man sagt Booleanist schneller. Nur ein Hinweis darauf, wie klein das Delta zwischen den Tests ist. Boolesche Prüfungen sind schnell. jsperf.com/bool-not-not jsperf.com/bool-vs-doublenot
iSkore
Ich bin damit einverstanden, dass der Unterschied nicht messbar ist und in diesem Fall die Lesbarkeit sollte AFAIK immer an erster Stelle stehen. Somit ist der Standard und verständlich typeof val === "boolean"optimal.
M93a
1
Ja, dem stimme ich zu. Lesbarkeit ist wichtig. Operatoren sind nicht so lesbar - werden aktualisiert
iSkore
16

Sie können reines Javascript verwenden, um dies zu erreichen:

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

Wenn Sie möchten, dass Ihre Funktion auch boolesche Objekte validieren kann, muss die effizienteste Lösung sein:

function isBoolean(val) {
  return val === false || val === true || val instanceof Boolean;
}
Willem Franco
quelle
Instanz von Boolean ist für mich nicht deklariert.
Dudi
3

Der zuverlässigste Weg, um den Typ einer Variablen in JavaScript zu überprüfen, ist der folgende :

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"

Der Grund für diese Komplikation ist , dass typeof trueErträge , "boolean"während typeof new Boolean(true)Renditen "object".

Volodymyr Frolov
quelle
Warum sollten Sie zurückgeben, "boolean"wenn der Wert wirklich ein Objekt ist? Das scheint mir nicht sehr praktisch zu sein. Boolesche Objekte müssen ohnehin anders behandelt werden als boolesche Grundelemente.
Felix Kling
1
Der Code ist nicht sauber, hübsch oder klar. Beachten Sie, dass das OP nach einem "saubereren Weg, dies zu erreichen" fragt.
Spencer Wieczorek
Ich bin damit einverstanden, dass der Code nicht sauber oder hübsch ist, aber AFAIK gibt es keine hübsche und gleichzeitig zuverlässige Option für den Fall, dass sowohl boolesche Grundelemente als auch boolesche Objekte in der Szene vorhanden sind.
Volodymyr Frolov
Dies scheint eine ernsthafte Overkill-Lösung zu sein, um etwas zu tun, das nativ getan werden kann.
Brandonscript
3

Ich würde mich für Lodash entscheiden: isBoolean prüft, ob die übergebene Variable entweder ein primitives boolesches oder ein boolesches Wrapper-Objekt ist, und berücksichtigt daher alle Fälle.

Marcus Junius Brutus
quelle
1

Sie können eine Funktion erstellen, die das typeofauf ein Argument überprüft .

function isBoolean(value) {
  return typeof value === "boolean";
}
Mohsen Kadoura
quelle
1

Manchmal brauchen wir einen einzigen Weg, um das zu überprüfen. Art funktioniert nicht für Datum usw. Also machte ich es einfach durch

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

Auch für Number, String, Booleanusw. wir oft müssen die Art in einer einzigen Art und Weise überprüfen ...

Imam Kuncoro
quelle
1

Das Erstellen von Funktionen, isBooleandie Oneliner enthalten, typeof v === "boolean"scheint auf lange Sicht sehr unhandlich zu sein. Ich bin überrascht, dass fast jeder vorschlägt, eine eigene Funktion zu erstellen. Es scheint der gleiche Krebs zu sein wie die Erweiterung nativer Prototypen.

  • Sie müssen sie in jedem Projekt, an dem Sie beteiligt sind, neu erstellen
  • Andere Entwickler haben möglicherweise andere Gewohnheiten oder müssen die Quelle Ihrer Funktion überprüfen, um festzustellen, welche Implementierung der Überprüfung Sie verwenden, um zu wissen, was Schwachstellen Ihrer Prüfung sind
  • Sie werden begeistert sein, wenn Sie versuchen, einen Liner in der Konsole vor Ort zu schreiben, der nicht zu Ihrem Projekt gehört

nur auswendig lernen typeof v === "boolean"und das ist alles. Fügen Sie Ihrer IDE eine Vorlage hinzu, um sie mit einer Verknüpfung aus drei Buchstaben zu versehen und glücklich zu sein.

Kamil Orzechowski
quelle
1
Übrigens, wenn die Leistung sehr, sehr wichtig ist, hat die Funktion zum Überprüfen des Booleschen Werts in meinen Tests 10% mehr Zeit in Anspruch genommen als das Inline-Ausführen (for-loop 100000000x) auf Node.js. Aber die schlechteste Option war v === true || v === false, die im Fall von 2 Überprüfungen durchführt false. Rangliste: (1 - beide praktisch gleich) typeof v === 'booleanund typeof v === typeof true(2) isBoolean(v), (3) v === true || v === false.
Jpenna
Ich bin damit nicht einverstanden. Unterschiedliche Gewohnheiten sind der genaue Grund dafür: Wie oft habe ich Fehler erlebt, weil jeder die Dinge anders überprüft hat? Wenn Sie einen Ort haben, an dem Sie nach einem booleschen Wert suchen können, ist dies IMO gegenüber Überprüfungen unterschiedlichen Stils in der gesamten Codebasis sehr vorzuziehen. Es ist auch viel einfacher, das Verhalten einer solchen Funktion konsequent zu ändern.
Lucas Manzke
1
if(['true', 'yes', '1'].includes(single_value)) {
    return  true;   
}
else if(['false', 'no', '0'].includes(single_value)) {
    return  false;  
}

wenn Sie eine Zeichenfolge haben

Denver
quelle
1
  • Am lesbarsten : val === false || val === true.
  • Auch lesbar : typeof variable == typeof true.
  • Das kürzeste, aber überhaupt nicht lesbare : !!val === val.

    Erläuterung:

    • [!!] Das doppelte Ausrufezeichen konvertiert den Wert in einen Booleschen Wert.
    • [===] Der Triple-Equals- Test für strikte Gleichheit: Sowohl der Typ (Boolean) als auch der Wert müssen gleich sein.
    • Wenn der ursprüngliche Wert kein Boolescher Wert ist, besteht er den Triple-Equals-Test nicht. Wenn es sich um eine boolesche Variable handelt, besteht sie den Triple-Equals-Test (mit Typ und Wert).

    Tests:

    • !! 5 === 5 // false
    • !! 'test' === 'test' // false
    • let val = new Date (); !! val === val // false
    • !! true === true // true
    • !! false === false // true
TechWisdom
quelle
0

In nodejs können wir mit node-boolify isBoolean () verwenden;

        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
Ratan Uday Kumar
quelle
Ist boolesche Rückgabe nur wahr, wenn Wert boolescher Wert ist
Ratan Uday Kumar
0

Noch eine Entscheidung mit der Pfeilfunktion es2015

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