O meu favorito é usar !!
. É também o método recomendado pelo guia de estilo JavaScript da Airbnb 👍
Boolean(value);!!value;
# Converter Valores para Booleano
# String
const string = 'string';!!string; // trueBoolean(string); // true
# Número
const number = 100;!!number; // trueBoolean(number); // true
# Valores Falsificados
Em JavaScript, existem 6 valores falsificados. Se converter algum destes em boolean
, ele irá retornar false
.
falseundefinednullNaN0"" (empty string)
Tudo o que não estiver na lista falsa, retornará true
👍
Mais informações sobre isto, pode ler as minhas Notas de Código sobre Valores Falsificados
# Exemplos
Aplicando !!
sobre valores falsificados
!!false; // false!!undefined; // false!!null; // false!!NaN; // false!!0; // false!!''; // false
Aplicando Boolean
sobre valores falsificados
Boolean(false); // falseBoolean(undefined); // falseBoolean(null); // falseBoolean(NaN); // falseBoolean(0); // falseBoolean(''); // false
# Como o !! funciona
O primeiro !
coagir o valor a um booleano e invertê-lo. Neste caso, !value
irá retornar false
. Assim, para o inverter para true
, colocamos outro !
nele. Daí o uso duplo !!
.
const value = 'string';!value; // false!!value; // true
# Cuidado com ‘falso’
const value = 'false';!!value; // trueBoolean(value); // true
Nota o "false"
está entre aspas '
. Embora diga false
, na realidade é uma corda. Sei que a maioria de vós não cairá nesta, mas se forem como eu, talvez queiram apenas estar alerta para estes truques mentais engraçados que as pessoas podem estar a pregar-vos 😂
# Community Input
@tassoevan : gosto de filtrar valores falsificados de arrays como este: myArray.filter(Boolean)
p>@fleonus : Gosto de !+!
só para ser fixe e expulsar as pessoas 😛
# Teste de Velocidade
Havia um teste que eu encontrei:
p>booleano vs !!
Parece que o !!
é um pouco mais rápido que Boolean
# Qual usar?
Recebi muitos comentários sobre este post. Algumas pessoas preferem o Boolean
porque é mais explícito.
Mas, Kyle Simpson do You Don’t Know JS, mencionou que ambos são explícitos.
// better (works explicitly):if (!!a) {}// also great (works explicitly):if (Boolean(a)) {}
Kyle Simpson: YDKJS – Coercion
Não creio que tenha uma grande resposta para si. Conhecerá a sua equipa muito melhor do que eu. Continuarei a usar !!
nos meus próprios projectos pessoais, porque é menos dactilografia e compreendo esta sintaxe. Mas se eu estivesse numa equipa, poderia escolher Boolean
porque penso que a maioria dos programadores entenderia isso melhor. Não importa qual deles escolher, o mais importante é ser consistente. Não faça um “flip-flop” entre os dois na sua base de código. Escolha uma e mantenha-se fiel a ela 💪
Ainda a um comentário fantástico que recebi:
@patrick_developer: Digo que se deve compreender ambos, caso se apresente uma base de código diferente que utilize cada um deles. Conhecimento é poder.
Por outras palavras, uma não é melhor do que a outra. Esta, eu diria que é mais uma preferência. Portanto, não se pode errar. Mas não se prive da compreensão de ambos. Como Patrick disse, “Conhecimento é poder” 💪
# Evite novos Booleanos
Utilizar Primitivos em vez de Tipos de Objectos
var str = 'str';// Avoidtypeof new Boolean(str); // object// Preferredtypeof Boolean(str); // booleantypeof !!str; // boolean
CJ J.: Vale a pena notar que new Boolean
não é um booleano, mas sim um exemplo de Booleano. Os primitivos são mais baratos e devem ser preferidos em relação ao tipo de objecto.
CJ J..: new Boolean(str)
devolve um tipo de objecto. Boolean(str)
devolve apenas um booleano primitivo. Eu suspeitaria que Boolean(str)
é mais rápido que !!str
porque é apenas uma operação, mas também é inteiramente possível que os navegadores implementem uma optimização tal que quando virem !!
saibam lançar directamente o argumento a um primitivo booleano (em vez de fazerem NOT()
duas vezes seguidas).
CJ J..: Os primitivos são baratos porque são imutáveis para que se possa partilhar referências e não ter de manter qualquer estado na instância. É apenas true
ou false
. Mas new Boolean(str)
é um objecto. Tem o seu próprio endereço de memória único e pode manter um estado interno que lhe é único. Isto significa que não pode conter apenas uma referência a uma instância de um único botão imutável. Cada chamada para new Boolean(str)
instancia todo um novo Boolean()
objecto.
agradecimentos: CJ J .
# Remove cordas vazias com Boolean Constructor
CJ J.: Este é o exemplo clássico. Se obtiver uma lista de valores de cordas separadas por vírgulas e quiser filtrar as cordas vazias, pode passar a função construtor booleano para Array.prototype.filter e este irá automaticamente retirar as cordas de comprimento zero deixando apenas uma série de cordas válidas.
var str = 'some,list,,of,values';var arr = str.split(',');arr; // arr.filter(Boolean); //
Thanks: CJ J .