Eu tenho uma variável que armazena false
ou true
, mas preciso 0
ou 1
, em vez disso, respectivamente. Como posso fazer isso?
276
Eu tenho uma variável que armazena false
ou true
, mas preciso 0
ou 1
, em vez disso, respectivamente. Como posso fazer isso?
bool === true ? 1 : 0
, pois é de longe o mais rápido no V8.bool ? 1 : 0;
Respostas:
Javascript tem um operador ternário que você pode usar:
fonte
NaN
. Portanto, se você deseja L33T e garante a entrada, seja cauteloso, caso contrário, acho que o teste ternário + verdade é o melhor.Use o operador unário
+
, que converte seu operando em um número.Observe, é claro, que você ainda deve limpar os dados no lado do servidor, porque um usuário pode enviar qualquer dado ao seu servidor, independentemente do código do lado do cliente.
fonte
Number()
é ainda mais lento.bool === true ? 1 : 0
ser o mais rápido, com um segundo próximo debool | 0
.A melhor solução é:
Isso é usado no asm.js para forçar o tipo inteiro.
fonte
1
número inteiro, se fooBar não estiver?Eu prefiro usar a função Number . Ele pega um objeto e o converte em um número.
Exemplo:
Você pode testá-lo em um jsFiddle .
fonte
Eu criei uma comparação JSperf de todas as respostas sugeridas.
TL; DR - a melhor opção para todos os navegadores atuais é:
.
Atualizar:
Parece que hoje em dia eles são todos idênticos, exceto que a
Number()
função é a mais lenta e a melhorval === true ? 1 : 0;
.fonte
A maneira digitada de fazer isso seria:
fonte
Acabei de encontrar este atalho hoje.
~~ (verdadeiro)
~~ (falso)
Pessoas muito mais inteligentes do que eu posso explicar:
http://james.padolsey.com/javascript/double-bitwise-not/
fonte
Quando o JavaScript espera um valor numérico, mas recebe um booleano, ele o converte em um número: true e false convertem em 1 e 0, respectivamente. Então você pode tirar proveito disso;
Leitura adicional Conversões de tipo Capítulo 3.8 do Guia definitivo para Javascript.
fonte
O
+
operador unário cuidará disso:Naturalmente, você deseja verificar isso com integridade no servidor antes de armazená-lo, para que, de qualquer maneira, seja um local mais sensato para fazer isso.
fonte
===
, porquetrue == 1
é verdade mesmo sem a "conversão explícita :-), emtrue === 1
vez disso, é falsa.Eu estava lidando com esse problema em algum código que estava escrevendo. Minha solução foi usar um bit a bit e.
Uma maneira mais rápida de lidar com um problema constante seria criar uma função. É mais legível por outras pessoas, melhor para a compreensão no estágio de manutenção e se livra do potencial de escrever algo errado.
Editar - 10 de setembro de 2014
Nenhuma conversão usando um operador ternário com o mesmo operador é mais rápida no Chrome por algum motivo. Não faz sentido o porquê de ser mais rápido, mas suponho que seja algum tipo de otimização de baixo nível que faça algum sentido ao longo do caminho.
Teste você mesmo: http://jsperf.com/boolean-int-conversion/2
No FireFox e no Internet Explorer, o uso da versão que eu publiquei geralmente é mais rápido.
Editar - 14 de julho de 2017
Ok, não vou dizer qual você deve ou não usar. Todos os navegadores estão subindo e descendo com a rapidez com que podem executar a operação com cada método. O Chrome, em um ponto, na verdade, tinha a versão bit a bit e melhor do que as outras, mas, de repente, ficou muito pior. Não sei o que eles estão fazendo, então vou deixar para quem se importa. Raramente existe motivo para se preocupar com a rapidez com que uma operação como essa é feita. Mesmo no celular, é uma operação do nada.
Além disso, eis um método mais novo para adicionar um protótipo 'toInt' que não pode ser substituído.
fonte
Você também pode adicionar 0, usar operadores shift ou xor:
Eles têm velocidades semelhantes às das outras respostas.
fonte
No meu contexto, React Native, onde estou obtendo o valor de opacidade do booleano, a maneira mais fácil: Use o operador unary +.
Isso converte o booleano em número;
fonte
Você pode fazer isso simplesmente estendendo o protótipo booleano
Não é muito fácil entender o que está acontecendo lá; portanto, uma versão alternativa seria
tendo feito o que você pode fazer coisas como
Quando uso booleanos para armazenar condições, costumo convertê-los em campos de bits. Nesse caso, acabo usando uma versão estendida da função prototype
com o qual você pode fazer
que produz 4 como sua saída.
fonte
fonte
experimentar
Mostrar snippet de código
fonte
Eu testei todos esses exemplos, fiz uma referência e, finalmente, recomendo que você escolha a mais curta, não afeta o desempenho.
Resultado
fonte
se você quiser um valor inteiro x, altere se 1 a 0 e se 0 a 1 você pode usar (x + 1)% 2
fonte