Cómo verificar si el tipo es booleano

269

¿Cómo puedo verificar si el tipo de una variable es de tipo booleano?

Quiero decir, hay algunas alternativas como:

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

Pero eso no me parece bonito.

¿Hay una forma más limpia de lograr esto?

Matias Cicero
fuente
1
¿No son trueo falsede tipo booleano?
Matias Cicero
1
No necesita verificar, puede hacer esto !!( ... some expression ...)y el resultado será un booleano.
Callum Linington
1
No: truey falseson primitivas de tipo boolean. El tipo booleano capital-B es un tipo de envoltura de objetos para primitivas booleanas.
Pointy
@CallumLinington que no funcionará para los objetos creados con el constructor booleano :)
Pointy
1
@CallumLinington intente: if (new Boolean(false)) alert("hi");- un objeto booleano con mayúscula B siempre es "verdadero", independientemente del valor booleano little-b subyacente.
Pointy

Respuestas:

506

Para eso typeofestá ahí. Los paréntesis son opcionales ya que es un operador .

if (typeof variable === "boolean"){
  // variable is a boolean
}
Amit Joki
fuente
77
No está claro qué está tratando de hacer el OP, pero los objetos booleanos con mayúscula B dan "objeto" como su tipo vía typeof.
Pointy
14
1) typeofno es una función. 2) Usando el operador triple === contypeof No se requiere , ya que devolverá siempre una cadena (afaik, pero por lo que recuerdo, hubo otro caso para algunos navegadores muy antiguos). 3) typeofy las comparaciones de cadenas son lentas. No los uses. Consulte directamente con (variable === true || variable === false)(sugiero escribir una función).
StanE
66
no typeof(variable) === typeof(true)sería más robusto?
Marcus Junius Brutus
2
@TusharNiras namees una propiedad de ventana global con un captador especial developer.mozilla.org/en-US/docs/Web/API/Window/name
Zach Lysobey
1
@MarcusJuniusBrutus @AmitJoki no tiene sentido, no hay ninguna ventaja en usar más detallado en typeof truelugar de "boolean". Las nuevas versiones de ECMAScript nunca tendrán cambios importantes.
m93a
40

Si solo desea verificar un valor primitivo

typeof variable === 'boolean'

Si por alguna extraña razón tiene booleanos creados con el constructor, esos no son realmente booleanos, sino objetos que contienen un valor booleano primitivo, y una forma de verificar los booleanos primitivos y los objetos creados con new Booleanes hacer:

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

adeneo
fuente
2
No me parece muy práctico tratar las primitivas booleanas y los objetos booleanos como iguales, porque de todos modos no puedo usarlos de la misma manera.
Felix Kling
@FelixKling: tampoco me parece muy práctico, pero parece que el OP está tratando de determinar si una variable es booleana, incluso cuando se crea con new Boolean(), que técnicamente no es un booleano, sino un objeto, pero aún se mantiene Un valor booleano.
adeneo
Creo que el OP simplemente no sabía que new Boolean()devuelve un objeto (ver comentarios en la pregunta). Pero lo que sea :)
Felix Kling
@FelixKling: solo releí la pregunta y los comentarios, y ahora veo que el OP básicamente está tratando de hacer typeof variable === typeof new Boolean()y probablemente solo quiere un tipo de verificación regular, pero de alguna manera quedó atrapado en una extraña sintaxis de jQuery.
adeneo
Dependiendo de qué tan resistente desea hacer su código, si el boolparámetro pasado fuera nullel typeof bool === 'object'que aún se evaluaría y se TypeError: Cannot read property 'valueOf' of nullgeneraría una excepción en la llamada a typeof bool.valueOf(). Por lo tanto, me gustaría cambiar la última línea para que diga: (typeof bool === 'object' && bool && typeof bool.valueOf() === 'boolean');que evaluar sólo cuando booles no nula.
Al Dass
35

Con JavaScript puro , simplemente puede usar typeofy hacer algo como typeof falseo typeof truey volverá "boolean"...

Pero esa no es la única forma de hacerlo, estoy creando funciones a continuación para mostrar diferentes formas en que puede verificar Boolean en JavaScript, también diferentes formas en que puede hacerlo en algunos marcos nuevos, comencemos con este:

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

O una línea ES6 forma ...

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

y llámalo como!

isBoolean(false); //return true

También en el código fuente de subrayado lo comprueban así (con el _. Al comienzo del nombre de la función):

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

También en jQuery puedes verificarlo así:

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

En React , si usa propTypes, puede verificar que un valor sea booleano como este:

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

Si usa TypeScript , puede usar type boolean también:

let isDone: boolean = false;

También otra forma de hacerlo, es como convertir el valor a booleano y ver si es exactamente igual, algo así como:

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

o como:

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

y llámalo!

isBoolean(false); //return true

No se recomienda usar ningún marco para esto, ya que es realmente una simple verificación en JavaScript.

Alireza
fuente
En desacuerdo: new Boolean(true) === new Boolean(true)debe devolver falso (ya que las referencias son diferentes). Es por eso isBoolean(new Boolean(true))que dirá falso mientras debe ser verdadero ( new Boolean(true)es de tipo booleano ).
AlexMelw
17

Hay tres formas "vainilla" de verificar esto con o sin jQuery.

  1. Primero es forzar la evaluación booleana por coerción, luego verifique si es igual al valor original:

    function isBoolean( n ) {
        return !!n === n;
    }
  2. Haciendo un simple typeofchequeo:

    function isBoolean( n ) {
        return typeof n === 'boolean';
    }
  3. Hacer una exageración completamente innecesaria e innecesaria de un contenedor de clase en una primitiva:

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

El tercero solo regresará true si crea una new Booleanclase y la pasa.

Para profundizar en la coerción de primitivas (como se muestra en el n. ° 1), todos los tipos de primitivas se pueden verificar de esta manera:

  • Boolean:

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

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

    function isString( n ) {
        return ''+n === n;
    }
iSkore
fuente
¿Por qué es la coersión tipo "más óptima"? ¿Es más rápido o más legible que typeof? Lo dudo mucho.
m93a
Entonces, en teoría, coaccionar el valor a un valor booleano hace 1 coerción + 2 comparaciones + 1 comparación. Las dos primeras comparaciones son durante los pasos de coerción, y la última comparación es contra la primera posición (que ahora es una primitiva). Hacer typeoftambién es 1 coerción, pero el typeofmétodo hace algunos captadores y comparaciones dentro de la comparación + 1 al final. Aquí está la referencia V8typeof
iSkore
1
Después de todo, cualquiera de los métodos es tan rápido que la diferencia de nanosegundos es tan pequeña que sería difícil incluso probar cuál fue más rápido. Aquí hay dos JSPerf. Uno dice que !!es más rápido, uno dice que Booleanes más rápido. Solo una referencia a cuán pequeño es el delta entre pruebas. Los cheques booleanos son rápidos. jsperf.com/bool-not-not jsperf.com/bool-vs-doublenot
iSkore
Estoy de acuerdo en que la diferencia no es medible y, en tal caso, la legibilidad debería ser AFAIK siempre la primera. Por lo tanto, lo estándar y lo comprensible typeof val === "boolean"es óptimo.
m93a
1
Sí, estoy de acuerdo con eso. La legibilidad es importante. Los operadores no son tan legibles - se actualizarán
iSkore
16

Puede usar Javascript puro para lograr esto:

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

Si desea que su función también pueda validar objetos booleanos, la solución más eficiente debe ser:

function isBoolean(val) {
  return val === false || val === true || val instanceof Boolean;
}
Willem Franco
fuente
instanceof Boolean no está declarado para mí.
Dudi
3

La forma más confiable de verificar el tipo de una variable en JavaScript es la siguiente :

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 razón de esta complicación es que typeof trueregresa "boolean"mientras typeof new Boolean(true)regresa "object".

Volodymyr Frolov
fuente
¿Por qué querrías regresar "boolean"si el valor realmente es un objeto? Eso no me parece muy práctico. Los objetos booleanos tienen que tratarse de manera diferente a las primitivas booleanas de todos modos.
Felix Kling
1
El código no es limpio, bonito o claro. Tenga en cuenta que el OP está pidiendo una "forma más limpia de lograr esto".
Spencer Wieczorek
Estoy de acuerdo en que el código no es limpio o bonito, pero AFAIK no existe una opción bonita y al mismo tiempo confiable en caso de que haya primitivas booleanas y objetos booleanos en la escena.
Volodymyr Frolov
Esto parece una solución exagerada para hacer algo que se puede hacer de forma nativa.
brandonscript
3

Yo iría con Lodash: isBoolean comprueba si la variable pasada es un objeto booleano primitivo o un objeto de envoltorio booleano y, por lo tanto, tiene en cuenta todos los casos.

Marcus Junius Brutus
fuente
1

Puede crear una función que verifique typeofsi hay un argumento.

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

A veces necesitamos una única forma de verificarlo. typeof no funciona para la fecha, etc. Así que lo hice fácil al

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

También para Number, String, Booleanetc a menudo necesitamos para comprobar el tipo de una sola manera ...

Imam Kuncoro
fuente
1

Crear funciones como la isBooleanque contiene oneliner typeof v === "boolean"parece muy desagradable a largo plazo. Me sorprende que casi todos sugieran crear su propia función. Parece ser el mismo cáncer que extender los prototipos nativos.

  • necesitas recrearlos en cada proyecto en el que estés involucrado
  • otros desarrolladores pueden tener hábitos diferentes, o necesitan verificar la fuente de su función para ver qué impedancia del cheque usa, para saber cuáles son los puntos débiles de su cheque
  • se verá frustrado cuando intente escribir un revestimiento en la consola en el sitio que no pertenece a su proyecto

solo memorizar typeof v === "boolean"y eso es todo. Agregue una plantilla a su IDE para poder ponerla en un atajo de tres letras y ser feliz.

Kamil Orzechowski
fuente
1
Por cierto, si el rendimiento es muy muy importante, tener una función para verificar el valor booleano tomó un 10% más de tiempo en mis pruebas que hacerlo en línea (for-loop 100000000x) en Node.js. Pero la peor opción fue v === true || v === false, que hace 2 verificaciones en caso de false. Clasificación: (1 - ambos prácticamente iguales) typeof v === 'booleany typeof v === typeof true, (2) isBoolean(v), (3) v === true || v === false.
jpenna
No estoy de acuerdo con esto de todo corazón. Los diferentes hábitos son la razón exacta: ¿Con qué frecuencia he experimentado errores porque todos revisaron las cosas de manera diferente? Si tiene un lugar para verificar un valor booleano, es mucho más preferible que las verificaciones de estilo diferente en toda la base de código. También es mucho más fácil cambiar constantemente el comportamiento de dicha función.
Lucas Manzke
1
if(['true', 'yes', '1'].includes(single_value)) {
    return  true;   
}
else if(['false', 'no', '0'].includes(single_value)) {
    return  false;  
}

si tienes una cuerda

Denver
fuente
1
  • La más legible: val === false || val === true.
  • También puede leer: typeof variable == typeof true.
  • El más corto, pero no se puede leer en absoluto: !!val === val.

    Explicación:

    • [!!] Los doble exclamación convierte el valor en booleano.
    • [===] El triple es igual prueba de para la igualdad estricta: tanto el tipo (booleano) como el valor tienen que ser iguales.
    • Si el valor original no es booleano, no pasará la prueba de triple igual. Si es una variable booleana, pasará la prueba de triple igual (con ambos tipos y valores).

    Pruebas:

    • !! 5 === 5 // falso
    • !! 'prueba' === 'prueba' // falso
    • let val = nueva Fecha (); !! val === val // falso
    • !! verdadero === verdadero // verdadero
    • !! falso === falso // verdadero
TechWisdom
fuente
0

En nodejs usando node-boolify podemos usar 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
fuente
¿El retorno booleano es verdadero solo si el valor es un valor booleano
Ratan Uday Kumar
0

Una decisión más con la función de flecha es2015

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