Comment vérifier si le type est booléen

269

Comment puis-je vérifier si le type d'une variable est de type booléen?

Je veux dire, il existe des alternatives telles que:

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

Mais cela ne me semble pas joli.

Existe-t-il un moyen plus propre d'y parvenir?

Matias Cicero
la source
1
N'est-ce pas trueou falsede type booléen?
Matias Cicero
1
Vous n'avez pas besoin de vérifier, vous pouvez le faire !!( ... some expression ...)et le résultat sera un booléen.
Callum Linington
1
Non: trueet falsesont des primitives de type boolean. Le type booléen capital-B est un type d'encapsuleur d'objet pour les primitives booléennes.
Pointy
@CallumLinington qui ne fonctionnera pas pour les objets créés avec le constructeur booléen :)
Pointy
1
@CallumLinington essayez: if (new Boolean(false)) alert("hi");- un objet booléen B majuscule est toujours "véridique", quelle que soit la valeur booléenne Little B sous-jacente.
Pointy

Réponses:

506

C'est pour ça typeof. Les parenthèses sont facultatives car il s'agit d'un opérateur .

if (typeof variable === "boolean"){
  // variable is a boolean
}
Amit Joki
la source
7
On ne sait pas exactement ce que l'OP essaie de faire, mais les objets booléens en majuscule B donnent "objet" comme type via typeof.
Pointy
14
1) typeofn'est pas une fonction. 2) L'utilisation de l'opérateur triple === avec typeofn'est pas requise, car elle renverra toujours une chaîne (afaik, mais pour autant que je m'en souvienne, il y avait un autre cas pour certains navigateurs très anciens). 3) typeofet les comparaisons de chaînes sont lentes. Ne les utilisez pas. Vérifiez directement avec (variable === true || variable === false)(je suggère d'écrire une fonction).
StanE
6
ne serait pas typeof(variable) === typeof(true)plus robuste?
Marcus Junius Brutus
2
@TusharNiras nameest une propriété de fenêtre globale avec un getter spécial developer.mozilla.org/en-US/docs/Web/API/Window/name
Zach Lysobey
1
@MarcusJuniusBrutus @AmitJoki c'est un non-sens, il n'y a aucun avantage à utiliser plus verbeux à la typeof trueplace de "boolean". Les nouvelles versions d'ECMAScript n'auront jamais de changements de rupture.
m93a
40

Si vous voulez simplement vérifier une valeur primitive

typeof variable === 'boolean'

Si pour une raison étrange vous avez créé des booléens avec le constructeur, ce ne sont pas vraiment des booléens mais des objets contenant une valeur booléenne primitive, et une façon de vérifier les booléens primitifs et les objets créés avec new Booleanest de faire:

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

adeneo
la source
2
Il ne me semble pas très pratique de traiter les primitives booléennes et les objets booléens de la même manière, car je ne peux pas les utiliser de la même manière de toute façon.
Felix Kling
@FelixKling - ne me semble pas très pratique non plus, mais il semble que l'OP essaie de déterminer si une variable est un booléen, même lorsqu'elle est créée avec new Boolean(), qui n'est pas un booléen, mais un objet, mais qui contient toujours une valeur booléenne.
adeneo
Je pense que l'OP ne savait tout simplement pas que new Boolean()renvoie un objet (voir les commentaires sur la question). Mais peu importe :)
Felix Kling
@FelixKling - Relisez simplement la question et les commentaires, et je vois maintenant que l'OP essaie essentiellement de le faire typeof variable === typeof new Boolean()et veut probablement juste une vérification de typeof régulière, mais s'est en quelque sorte retrouvé pris dans une étrange syntaxe jQuery.
adeneo
En fonction de la résilience de votre code, si le boolparamètre transmis était nullle, il typeof bool === 'object'serait toujours évalué et une TypeError: Cannot read property 'valueOf' of nullexception serait levée lors de l'appel à typeof bool.valueOf(). Ainsi, je changerais cette dernière ligne pour lire: (typeof bool === 'object' && bool && typeof bool.valueOf() === 'boolean');qui n'évaluera que quand booln'est pas nul.
Al Dass
35

Avec du JavaScript pur , vous pouvez simplement utiliser typeofet faire quelque chose comme typeof falseou typeof trueet cela reviendra"boolean" ...

Mais ce n'est pas la seule façon de le faire, je crée des fonctions ci-dessous pour montrer différentes façons de vérifier le booléen en JavaScript, ainsi que différentes façons de le faire dans certains nouveaux cadres, commençons par celui-ci:

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

Ou façon ES6 sur une ligne ...

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

et appelez ça comme!

isBoolean(false); //return true

Toujours dans le code source Underscore, ils le vérifient comme ceci (avec le _. Au début du nom de la fonction):

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

Aussi dans jQuery vous pouvez le vérifier comme ceci:

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

Dans React , si vous utilisez propTypes, vous pouvez vérifier qu'une valeur est booléenne comme ceci:

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

Si vous utilisez TypeScript , vous pouvez également utiliser le type booléen :

let isDone: boolean = false;

Une autre façon de le faire, c'est comme convertir la valeur en booléen et voir si c'est toujours la même chose, quelque chose comme:

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

ou comme:

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

et appelez-le!

isBoolean(false); //return true

Il n'est pas recommandé d'utiliser un framework pour cela car c'est vraiment une simple vérification en JavaScript.

Alireza
la source
Pas d'accord: new Boolean(true) === new Boolean(true)doit retourner false (car les références sont différentes). C'est pourquoi le isBoolean(new Boolean(true))va dire faux alors qu'il doit être vrai ( new Boolean(true)est de type booléen ).
AlexMelw
17

Il existe trois façons "vanille" de vérifier cela avec ou sans jQuery.

  1. La première consiste à forcer l'évaluation booléenne par coercition, puis à vérifier si elle est égale à la valeur d'origine:

    function isBoolean( n ) {
        return !!n === n;
    }
  2. Faire une simple typeofvérification:

    function isBoolean( n ) {
        return typeof n === 'boolean';
    }
  3. Faire une instanciation complètement exagérée et inutile d'un wrapper de classe sur une primitive:

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

Le troisième ne reviendra que true si vous créez unnew Boolean classe et la transmettez.

Pour élaborer sur la coercition des primitives (comme indiqué dans # 1), tous les types de primitives peuvent être vérifiés de cette manière:

  • Boolean:

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

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

    function isString( n ) {
        return ''+n === n;
    }
iSkore
la source
Pourquoi la coersion de type est-elle "la plus optimale"? Est-ce plus rapide ou plus lisible que typeof? J'en doute fortement.
m93a
Donc, en théorie, contraindre la valeur à un booléen fait 1 coercition + 2 comparaisons + 1 comparaison. Les deux premières comparaisons sont pendant les étapes de coercition, et la dernière comparaison est contre la première position (qui est maintenant une primitive). Faire typeofest aussi 1 contrainte, mais la typeofméthode fait quelques getters et comparaisons à l'intérieur + 1 comparaison à la toute fin. Voici la référence V8 pourtypeof
iSkore
1
Après tout, l'une ou l'autre méthode est tellement rapide, la différence de nanosecondes est si petite qu'il serait difficile de tester celle qui était la plus rapide. Voici deux JSPerf. On dit que !!c'est plus rapide, on dit Booleanc'est plus rapide. Juste une référence à la petite taille du delta entre les tests. Les vérifications booléennes sont rapides. jsperf.com/bool-not-not jsperf.com/bool-vs-doublenot
iSkore
Je conviens que la différence n'est pas mesurable et dans ce cas, la lisibilité doit toujours être la priorité pour l'AFAIK. Ainsi, le standard et compréhensible typeof val === "boolean"est optimal.
m93a
1
Oui, je suis d'accord avec ça. La lisibilité est importante. Les opérateurs ne sont pas aussi lisibles - mettra à jour
iSkore
16

Vous pouvez utiliser du Javascript pur pour y parvenir:

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

Si vous voulez que votre fonction puisse également valider des objets booléens, la solution la plus efficace doit être:

function isBoolean(val) {
  return val === false || val === true || val instanceof Boolean;
}
Willem Franco
la source
instanceof Boolean n'est pas déclaré pour moi.
Dudi
3

Le moyen le plus fiable de vérifier le type d'une variable en JavaScript est le suivant :

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"

La raison de cette complication est que typeof trueretourne "boolean"tout typeof new Boolean(true)retourne "object".

Volodymyr Frolov
la source
Pourquoi voudriez-vous retourner "boolean"si la valeur est vraiment un objet? Cela ne me semble pas très pratique. Les objets booléens doivent de toute façon être traités différemment des primitives booléennes.
Felix Kling
1
Le code n'est pas propre, joli ou clair. Notez que l'OP demande une "manière plus propre d'y parvenir".
Spencer Wieczorek
Je suis d'accord que le code n'est pas propre ou joli, mais AFAIK il n'y a pas d'option jolie et en même temps fiable au cas où à la fois des primitives booléennes et des objets booléens sur la scène.
Volodymyr Frolov
Cela semble être une solution sérieusement exagérée pour faire quelque chose qui peut être fait nativement.
brandonscript
3

J'irais avec Lodash: isBoolean vérifie si la variable transmise est un objet wrapper booléen ou booléen primitif et rend donc compte de tous les cas.

Marcus Junius Brutus
la source
1

Vous pouvez créer une fonction qui vérifie la présence typeofd'un argument.

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

Parfois, nous avons besoin d'une seule façon de le vérifier. typeof ne fonctionne pas pour la date, etc.

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

Aussi pour Number, String, Booleanetc. nous avons souvent besoin de vérifier le type d'une manière unique ...

Imam Kuncoro
la source
1

La création de fonctions comme celle isBooleanqui contient un typeof v === "boolean"oneliner semble très difficile à long terme. je suis surpris que presque tout le monde suggère de créer votre propre fonction. Il semble que ce soit le même cancer que l'extension de prototypes natifs.

  • vous devez les recréer dans chaque projet auquel vous participez
  • d'autres développeurs peuvent avoir des habitudes différentes, ou avoir besoin de vérifier la source de votre fonction pour voir quelle implémentation de vérification vous utilisez, pour savoir quels sont les points faibles de votre vérification
  • vous serez frustré lorsque vous essaierez d'écrire un liner dans la console sur site qui n'appartient pas à votre projet

juste mémoriser typeof v === "boolean"et c'est tout. Ajoutez un modèle à votre IDE pour pouvoir le mettre par un raccourci de trois lettres et soyez heureux.

Kamil Orzechowski
la source
1
Soit dit en passant, si les performances sont très importantes, avoir une fonction pour vérifier la valeur booléenne a pris 10% plus de temps dans mes tests que de le faire en ligne (pour la boucle 100000000x) sur Node.js. Mais la pire option était v === true || v === false, qui fait 2 vérifications en cas de false. Classement: (1 - les deux pratiquement les mêmes) typeof v === 'booleanet typeof v === typeof true, (2) isBoolean(v), (3) v === true || v === false.
jpenna
Je suis totalement en désaccord avec cela. Différentes habitudes sont la raison exacte pour laquelle: Combien de fois ai-je rencontré des bugs parce que tout le monde a vérifié les choses différemment? Si vous avez un seul endroit pour vérifier une valeur booléenne, c'est bien préférable IMO aux vérifications de style différent partout dans la base de code. Il est également beaucoup plus facile de modifier systématiquement le comportement d'une telle fonction.
Lucas Manzke
1
if(['true', 'yes', '1'].includes(single_value)) {
    return  true;   
}
else if(['false', 'no', '0'].includes(single_value)) {
    return  false;  
}

si vous avez une chaîne

Denver
la source
1
  • Le plus lisible: val === false || val === true.
  • Aussi facile à lire: typeof variable == typeof true.
  • Le plus court, mais pas lisible du tout: !!val === val.

    Explication:

    • [!!] La double exclamation convertit la valeur en booléen.
    • [===] Le triple est égal à un test d'égalité stricte: le type (booléen) et la valeur doivent être identiques.
    • Si la valeur d'origine n'est pas booléenne, elle ne passera pas le test du triple égal. S'il s'agit d'une variable booléenne, elle passera le test du triple égal (avec le type et la valeur).

    Tests:

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

Dans nodejs en utilisant node-boolify, nous pouvons utiliser 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
Ratan Uday Kumar
la source
Le retour booléen est-il vrai uniquement si la valeur est une valeur booléenne
Ratan Uday Kumar
0

Une décision de plus avec la fonction flèche es2015

const isBoolean = val => typeof val === 'boolean';
Gor
la source