Como verificar se o tipo é booleano

269

Como posso verificar se o tipo de uma variável é do tipo Booleano?

Quero dizer, existem algumas alternativas, como:

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

Mas isso não me parece bonito.

Existe uma maneira mais limpa de conseguir isso?

Matias Cicero
fonte
1
Não são trueou falsedo tipo booleana?
Matias Cicero
1
Você não precisa verificar, pode fazer isso !!( ... some expression ...)e o resultado será um booleano.
Callum Linington
1
Não: truee falsesão primitivos do tipo boolean. O tipo Booleano maiúsculo-B é um tipo de invólucro de objeto para primitivas booleanas.
Pointy
@CallumLinington que não vai funcionar para objetos criados com o construtor booleana :)
Pointy
1
@CallumLinington try: if (new Boolean(false)) alert("hi");- um objeto booleano capital-B é sempre "verdadeiro", independentemente do valor booleano little-b subjacente.
quer

Respostas:

506

É para isso que typeofexiste. Os parênteses são opcionais, pois é um operador .

if (typeof variable === "boolean"){
  // variable is a boolean
}
Amit Joki
fonte
7
Não está claro o que o OP está tentando fazer, mas os objetos booleanos capital-B fornecem "object" como seu tipo via typeof.
Pointy
14
1) typeofnão é uma função. 2) typeofNão é necessário usar o operador triplo === com , pois ele sempre retornará uma string (afaik, mas, tanto quanto me lembro, havia outro caso para alguns navegadores muito antigos). 3) typeofe as comparações de strings são lentas. Não os use. Verifique diretamente com (variable === true || variable === false)(sugiro escrever uma função).
StanE 10/07/16
6
não typeof(variable) === typeof(true)seria mais robusto?
Marcus Junius Brutus
2
@TusharNiras nameé uma propriedade global janela com uma especial getter developer.mozilla.org/en-US/docs/Web/API/Window/name
Zach Lysobey
1
@MarcusJuniusBrutus @AmitJoki isso é um absurdo, não há vantagem em usar mais verbos em typeof truevez de "boolean". Novas versões O ECMAScript nunca terá alterações de última hora.
m93a 23/02/19
40

Se você deseja apenas verificar um valor primitivo

typeof variable === 'boolean'

Se, por algum motivo estranho, você tiver criado booleanos com o construtor, esses objetos não são realmente booleanos, mas objetos que contêm um valor booleano primitivo, e uma maneira de verificar os booleanos primitivos e os objetos criados com isso new Booleané:

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

adeneo
fonte
2
Não me parece muito prático tratar as primitivas booleanas e os objetos booleanos da mesma forma, porque não posso usá-los da mesma maneira.
Felix Kling
@FelixKling - também não parece muito prático para mim, mas parece que o OP está tentando determinar se uma variável é booleana, mesmo quando criada com new Boolean(), que tecnicamente não é booleana, mas um objeto, mas ainda é válida. um valor booleano.
#
Eu acho que o OP simplesmente não sabia que new Boolean()retorna um objeto (veja os comentários na pergunta). Mas qualquer que seja :)
Felix Kling
@ FelixKling - Apenas releia a pergunta e os comentários, e agora vejo que o OP está basicamente tentando fazer typeof variable === typeof new Boolean()e provavelmente quer apenas uma verificação regular do tipo, mas de alguma forma foi pego em alguma sintaxe estranha do jQuery.
adeneo
Dependendo de como resiliente você quiser fazer o seu código, se o boolparâmetro passado na era nullo typeof bool === 'object'faria ainda avaliar e uma TypeError: Cannot read property 'valueOf' of nullexceção seria lançada na chamada para typeof bool.valueOf(). Assim, eu mudaria a última linha para ler: (typeof bool === 'object' && bool && typeof bool.valueOf() === 'boolean');que avaliará apenas quando nãobool for nulo.
Al Dass
34

Com JavaScript puro , você pode simplesmente usar typeofe fazer algo como typeof falseou typeof truee ele retornará"boolean" ...

Mas essa não é a única maneira de fazer isso, estou criando funções abaixo para mostrar maneiras diferentes de verificar booleanos em JavaScript, também maneiras diferentes de fazê-lo em alguns novos frameworks, vamos começar com este:

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

Ou caminho ES6 de uma linha ...

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

e chame assim!

isBoolean(false); //return true

Também no código-fonte de sublinhado , eles verificam assim (com o _. No início do nome da função):

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

Também no jQuery, você pode verificar assim:

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

Em React , se você estiver usando propTypes, poderá verificar um valor para ser booleano assim:

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

Se você estiver usando o TypeScript , também poderá usar o tipo booleano :

let isDone: boolean = false;

Outra maneira de fazer isso é como converter o valor em booleano e verificar se ainda é exatamente o mesmo, algo como:

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

ou como:

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

e chame!

isBoolean(false); //return true

Não é recomendável usar nenhuma estrutura para isso, pois é realmente uma verificação simples no JavaScript.

Alireza
fonte
Discordo: new Boolean(true) === new Boolean(true)deve retornar false (como as referências são diferentes). É por isso que o isBoolean(new Boolean(true))dirá falso, enquanto deve ser verdadeiro ( new Boolean(true)é do tipo booleano ).
AlexMelw
17

Existem três maneiras "baunilha" de verificar isso com ou sem o jQuery.

  1. Primeiro é forçar a avaliação booleana por coerção e, em seguida, verifique se é igual ao valor original:

    function isBoolean( n ) {
        return !!n === n;
    }
  2. Fazendo uma typeofverificação simples :

    function isBoolean( n ) {
        return typeof n === 'boolean';
    }
  3. Fazendo um exagero completamente e instanciação desnecessária de um wrapper de classe em um primitivo:

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

O terceiro retornará apenas true se você criar umnew Boolean classe e passar essa informação.

Para elaborar a coerção das primitivas (como mostrado no # 1), todos os tipos de primitivas podem ser verificados desta maneira:

  • Boolean:

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

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

    function isString( n ) {
        return ''+n === n;
    }
iSkore
fonte
Por que a coerência de tipo é "mais ideal"? É mais rápido ou mais legível do que typeof? Eu duvido muito.
m93a 23/02/19
Portanto, em teoria, coagir o valor a um booleano faz 1 coerção + 2 comparações + 1 comparação. As duas primeiras comparações ocorrem durante as etapas de coerção e a última comparação é contra a primeira posição (que agora é primitiva). Fazer typeoftambém é uma coerção, mas o typeofmétodo faz alguns getters e comparações dentro de uma comparação no final. Aqui está a referência da V8 paratypeof
iSkore
1
Afinal, qualquer um dos métodos é tão rápido, a diferença de nanossegundos é tão pequena que seria difícil testar o que era mais rápido. Aqui estão dois JSPerf. Diz-se que !!é mais rápido, diz-se que Booleané mais rápido. Apenas uma referência ao tamanho do delta entre os testes. As verificações booleanas são rápidas. jsperf.com/bool-not-not jsperf.com/bool-vs-doublenot
iSkore:
Concordo que a diferença não é mensurável e, nesse caso, a legibilidade deve o AFAIK sempre ir primeiro. Assim, o padrão e o compreensível typeof val === "boolean"são ótimos.
M93a
1
Sim, eu concordo com isso. A legibilidade é importante. Os operadores não são tão legível - irá atualizar
iSkore
16

Você pode usar Javascript puro para conseguir isso:

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

Se você deseja que sua função também possa validar objetos booleanos, a solução mais eficiente deve ser:

function isBoolean(val) {
  return val === false || val === true || val instanceof Boolean;
}
Willem Franco
fonte
instanceof Boolean não é declarado para mim.
Dudi
3

A maneira mais confiável de verificar o tipo de uma variável no JavaScript é a seguinte :

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"

A razão para essa complicação é que typeof trueretorna "boolean"enquanto typeof new Boolean(true)retorna "object".

Volodymyr Frolov
fonte
Por que você gostaria de retornar "boolean"se o valor realmente é um objeto? Isso não parece muito prático para mim. Objetos booleanos devem ser tratados de maneira diferente das primitivas booleanas de qualquer maneira.
Felix Kling
1
O código não é limpo, bonito ou claro. Observe que o OP está pedindo uma "maneira mais limpa de conseguir isso".
Spencer Wieczorek
Concordo que o código não é limpo ou bonito, mas AFAIK não existe uma opção bonita e ao mesmo tempo confiável no caso de primitivas booleanas e objetos booleanos no local.
Volodymyr Frolov 02/03
Parece uma solução seriamente exagerada para fazer algo que pode ser feito de forma nativa.
brandonscript
3

Eu iria com o Lodash: isBoolean verifica se a variável passada é um objeto booleano primitivo ou wrapper booleano e, portanto, é responsável por todos os casos.

Marcus Junius Brutus
fonte
1

Você pode criar uma função que verifique se typeofhá um argumento.

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

Às vezes, precisamos de uma única maneira de verificar isso. typeof não funciona para a data etc. Então eu facilitei

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

Também para Number, String, Booleanetc., muitas vezes, precisa verificar o tipo em um único caminho ...

Imam Kuncoro
fonte
1

A criação de funções como a isBooleanque contém oneliner typeof v === "boolean"parece muito impraticável a longo prazo. Estou surpreso que quase todo mundo sugira criar sua própria função. Parece ser o mesmo câncer que a extensão de protótipos nativos.

  • você precisa recriá-los em todos os projetos nos quais está envolvido
  • outros desenvolvedores podem ter hábitos diferentes, ou precisam verificar a fonte de sua função para ver qual impementação de verificação você usa, para saber quais são os pontos fracos de sua verificação
  • você ficará frustrado ao tentar escrever um liner no console no local que não pertence ao seu projeto

apenas memorize typeof v === "boolean"e é tudo. Adicione um modelo ao seu IDE para poder colocá-lo com um atalho de três letras e ser feliz.

Kamil Orzechowski
fonte
1
A propósito, se o desempenho é muito muito importante, ter uma função para verificar o valor booleano demorou 10% mais tempo em meus testes do que fazê-lo em linha (loop for 100000000x) no Node.js. Mas a pior opção foi v === true || v === false, que faz 2 verificações no caso de false. Classificação: (1 - ambos praticamente iguais) typeof v === 'booleane typeof v === typeof true, (2) isBoolean(v), (3) v === true || v === false.
jpenna
Não concordo com isso de todo o coração. Hábitos diferentes são a razão exata do motivo: Quantas vezes experimentei bugs porque todos verificaram as coisas de maneira diferente? Se você tiver um local para verificar um valor booleano, é muito preferível o IMO às verificações de estilos diferentes em toda a base de código. Também é muito mais fácil alterar consistentemente o comportamento dessa função.
Lucas Manzke
1
if(['true', 'yes', '1'].includes(single_value)) {
    return  true;   
}
else if(['false', 'no', '0'].includes(single_value)) {
    return  false;  
}

se você tem uma string

Denver
fonte
1
  • O mais legível: val === false || val === true .
  • Também legível: typeof variable == typeof true .
  • O mais curto, mas não legível: !!val === val .

    Explicação:

    • [!!] A dupla exclamação converte o valor em um booleano.
    • [===] O teste de triplo igual para igualdade estrita: o tipo (Boolean) e o valor devem ser iguais.
    • Se o valor original não for booleano, ele não passará no teste de triplo igual. Se for uma variável booleana, passará no teste de triplicar iguais (com tipo e valor).

    Testes:

    • !! 5 === 5 // falso
    • !! 'teste' === 'teste' // falso
    • deixe val = nova data (); !! val === val // falso
    • !! verdadeiro === verdadeiro // verdadeiro
    • !! false === false // verdadeiro
TechWisdom
fonte
0

No nodejs usando o 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
fonte
É boolean retorno verdadeiro somente se o valor é booleano valor
Ratan Uday Kumar
0

Mais uma decisão com a função de seta es2015

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