Posso converter uma string que representa um valor booleano (por exemplo, 'true', 'false') em um tipo intrínseco em JavaScript?
Eu tenho um formulário oculto em HTML que é atualizado com base na seleção de um usuário em uma lista. Este formulário contém alguns campos que representam valores booleanos e são preenchidos dinamicamente com um valor booleano intrínseco. No entanto, quando esse valor é colocado no campo de entrada oculto, ele se torna uma sequência.
A única maneira que eu encontrei para determinar o valor booleano do campo, uma vez convertido em uma string, era depender do valor literal de sua representação em string.
var myValue = document.myForm.IS_TRUE.value;
var isTrueSet = myValue == 'true';
Existe uma maneira melhor de conseguir isso?
javascript
Kevin
fonte
fonte
string=(string==String(string?true:false))?(string?true:false):(!string?true:false);
function parseBool(val) { return val === true || val === "true" }
function checkBool(x) { if(x) {return true;} else {return false;} }
if (checkBool(x) != false) { ... } else { ... }
!!(parseInt(value) || value === "true")
Respostas:
Faz:
Você pode torná-lo mais rígido usando o operador de identidade (
===
), que não faz nenhuma conversão implícita de tipo quando as variáveis comparadas têm tipos diferentes, em vez do operador de igualdade (==
).Não faça:
Você provavelmente deve ter cuidado ao usar esses dois métodos para suas necessidades específicas:
Qualquer string que não seja a vazia será avaliada
true
usando-as. Embora sejam os métodos mais limpos que posso pensar em relação à conversão booleana, acho que não são o que você está procurando.fonte
myValue === 'true';
é precisamente equivalente amyValue == 'true';
. Não há nenhuma vantagem em utilizar===
mais==
aqui.===
e!==
sempre que fizer sentido, que é quase sempre.==
vs.===
é um dos poucos em que não. I completamente discordam que "quase sempre" faz sentido usar===
. Existem linguagens com tipos vagos, porque não queremos nos preocupar com o tipo; se verificarmos algo comoif (price >= 50)
se não nos importássemos se começou como uma string. Eu digo que, na maioria das vezes, queremos que tipos sejam manipulados. Nos raros casos em que não queremos malabarismo de tipos (por exemploif (price === null)
), usamos===
. Isso é o que eu faço há anos e nunca tive um problema.Atenção
Essa resposta herdada altamente votada é tecnicamente correta, mas cobre apenas um cenário muito específico, quando o valor da string é EXATAMENTE
"true"
ou"false"
.Uma string json inválida passada para essas funções abaixo lançará uma exceção .
Resposta original:
E se?
ou com jQuery
fonte
JSON.parse("TRUE".toLowerCase())
para que ele possa analisar corretamente.'true'.length === 4
?typeof str==="string"
&&str.length===4
&&str.charAt(0)==="t" && str.charAt(1)==="r" && str.charAt(2)==="u" && str.charAt(3)==="e"
&&true===true && true!==false && false===false
// só para ter certezafonte
"true"
,"yes"
e"1"
. 2)toLowerCase
não retornanull
. 3)Boolean(string)
é o mesmo questring!==""
aqui. =>switch(string.toLowerCase()) {case "false": case "no": case "0": case "": return false; default: return true;}
false
.default: return true;
é certamente possível. Mas isso mudaria o comportamento da função.Eu acho que isso é muito universal:
if (String(a) == "true")
...Vai:
fonte
String(a).toLowerCase() === 'true'
String("what about input like this that isn't a bool?") == "true"
String()
construtor:true+'' === 'true' // true
Lembre-se de combinar o caso:
Além disso, se for uma caixa de seleção de elemento de formulário, você também poderá detectar se a caixa de seleção está marcada:
Supondo que, se marcado, ele é "definido" igual a verdadeiro. Isso é avaliado como verdadeiro / falso.
fonte
myValue
passa a sernull
,true
ou algum outro tipo ...Você pode usar expressões regulares:
Se você gosta de estender a classe String, pode fazer:
Para aqueles (veja os comentários) que gostariam de estender o objeto String para obter isso, mas estão preocupados com a enumerabilidade e estão preocupados com o conflito com outro código que estende o objeto String:
(Não funciona em navegadores antigos, é claro, e o Firefox mostra falso, enquanto o Opera, Chrome, Safari e IE mostram verdadeiro. Bug 720760 )
fonte
Object.defineProperty
.parseBool
Olho de madeira tenha cuidado. Depois de ver as consequências depois de aplicar a resposta principal com mais de 500 upvotes, sinto-me obrigado a postar algo que é realmente útil:
Vamos começar da maneira mais curta, mas muito rigorosa:
E termine com uma maneira adequada e mais tolerante:
Teste:
fonte
false
valor booleanoJSON.parse
? Em termos de CPU, desempenho da memóriaEu pensei que a resposta de @Steven era a melhor e resolvi muito mais casos do que se o valor recebido fosse apenas uma string. Eu queria estender um pouco e oferecer o seguinte:
Não é necessário cobrir todo o
false
casos, se você já conhece todos ostrue
casos que precisaria considerar. Você pode passar qualquer coisa para esse método que possa passar por umtrue
valor (ou adicionar outros, é bem direto), e todo o resto seria consideradofalse
fonte
autocomplete="on"
Solução universal com análise JSON:
ATUALIZAÇÃO (sem JSON):
Eu também criei o violino para testá-lo http://jsfiddle.net/remunda/2GRhG/
fonte
getBool(undefined)
falhará Ao usar a versão JSON original e retornará true para a 2ª versão. Aqui está uma terceira versão que retorna false: function getBool (val) {var num; return val! = null && (! isNaN (num = + val)? !! num: !! String (val) .toLowerCase (). replace (!! 0, '')); }Sua solução está boa.
Usar
===
seria tolo nesse caso, pois o campovalue
sempre será umString
.fonte
===
? Em termos de desempenho, seria exatamente o mesmo se os dois tipos fossem Strings. Enfim, prefiro usar,===
pois sempre evito o uso de==
e!=
. Justificativas: stackoverflow.com/questions/359494/…value
sempre será umstring
nem==
nem===
são tolas. Ambos são a ferramenta certa para este trabalho. Eles diferem apenas quando os tipos não são iguais. Nesse caso,===
simplesmente retornafalse
enquanto==
executa um algoritmo de coerção de tipo intrincado antes da comparação.Isso retorna
false
para cada valor Falsas etrue
para cada valor truthy exceto para'false'
,'f'
,'no'
,'n'
, e'0'
(case-insensitive).fonte
O objeto booleano não possui um método de 'análise'.
Boolean('false')
retorna true, para que não funcione.!!'false'
também retornatrue
, para que não funcione também.Se você deseja que a string
'true'
retorne booleanotrue
e a string'false'
retorne booleanofalse
, a solução mais simples é usareval()
.eval('true')
retorna verdadeiro eeval('false')
retorna falso. Lembre-se das implicações de desempenho ao usá-loeval()
.fonte
var isTrueSet = (myValue === 'true');
é a melhor resposta.eval('TRUE')
; provar mais uma vez, issoeval()
é mau.JSON.parse('TRUE')
da resposta abaixo também falha espetacularmente. É muito fácil forçar uma condição de erro no JavaScript (ou em qualquer outro idioma). Para conta para isso, você deve normalizar a corda primeiro, por exemplo,var myValue = document.myForm.IS_TRUE.value.toLowerCase(); var isTrueSet = (myValue==='true' || myValue==='false') ? eval(myValue) : false;
.toLowerCase()
na resposta é o meu ponto. Não estou tentando forçar nada. MaiúsculasTRUE
é um valor bastante comum para ser retornado por muitos widgets da UI.Isso foi retirado da resposta aceita, mas na verdade tem um ponto muito fraco, e estou chocado com a quantidade de votos positivos, o problema com o qual você deve considerar o caso da string, porque isso diferencia maiúsculas de minúsculas
fonte
Eu uso o seguinte:
Essa função executa a coerção booleana usual, com exceção das seqüências de caracteres "false" (sem distinção entre maiúsculas e minúsculas) e "0".
fonte
Há muitas respostas e é difícil escolher uma. No meu caso, priorizo o desempenho ao escolher, então crio esse jsPerf que espero que possa trazer alguma luz aqui.
Resumo dos resultados (quanto maior, melhor):
Eles estão vinculados à resposta relacionada, onde você pode encontrar mais informações (prós e contras) sobre cada um; especialmente nos comentários.
fonte
fonte
function parseBoolean
em vezA expressão que você procura simplesmente é
como em
Isso testa
myValue
uma expressão regular, que não diferencia maiúsculas de minúsculas e não modifica o protótipo.Exemplos:
fonte
Para converter string ("true", "false") e booleano em booleano
Onde
flag
pode estarfonte
Já existem muitas respostas disponíveis. Mas seguir pode ser útil em alguns cenários.
Isso pode ser útil onde exemplos com valores não booleanos.
fonte
por que você não tenta algo assim
Ele retornará um erro quando algum outro texto for fornecido, em vez de verdadeiro ou falso, independentemente do caso, e capturará os números também como
fonte
Esta função pode lidar com strings e também com Boolean true / false.
Demonstração abaixo:
fonte
Eu estou usando esse
fonte
"true"
outrue
. Se vier o segundo, isso não funcionará. É possível fazer issodocument.prototype
para usar onde quisermos?De maneira geral, a maneira mais fácil (assumindo que sua string será 'true' ou 'false') é:
Sempre use o operador === em vez do operador == para esses tipos de conversões!
fonte
Como @ Shadow2531 disse, você não pode simplesmente convertê-lo diretamente. Eu também sugiro que você considere as entradas de string além de "true" e "false" que são 'verdade' e 'falsey' se o seu código for reutilizado / usado por outras pessoas. Isto é o que eu uso:
fonte
Você precisa separar (em sua opinião) o valor de suas seleções e a representação desse valor.
Escolha um ponto na lógica JavaScript em que eles precisam fazer a transição dos sentinelas de seqüência de caracteres para o tipo nativo e faça uma comparação lá, preferencialmente onde isso é feito apenas uma vez para cada valor que precisa ser convertido. Lembre-se de abordar o que precisa acontecer se a string sentinel não for a que o script conhece (por exemplo, você usa true ou false?)
Em outras palavras, sim, você precisa depender do valor da string. :-)
fonte
Minha opinião sobre esta questão é que ela visa satisfazer três objetivos:
O problema com o uso de JSON é que ele falha ao causar um erro de Javascript. Esta solução não é resiliente (embora satisfaça 1 e 3):
Esta solução não é concisa o suficiente:
Estou trabalhando para resolver esse problema exato do Typecast.js . E a melhor solução para todos os três objetivos é esta:
Funciona para muitos casos, não falha quando valores como {} são passados e é muito conciso. Além disso, ele retorna false como o valor padrão, em vez de indefinir ou lançar um erro, o que é mais útil no desenvolvimento de Javascript de baixa digitação. Bravo para as outras respostas que sugeriram!
fonte
'true'
, mas não para qualquer entrada de verdade . Para fazer com que ele atinja o objetivo nº 1, é apenas um pouco mais conciso que a solução nº 2 e muito menos legível.return /^(true|yes|1|t|y)$/i.test(str);
Estou um pouco atrasado, mas tenho um pequeno trecho para fazer isso, ele essencialmente mantém todos os JScripts verdadeiros / falsos / imundos, mas inclui
"false"
como um valor aceitável para falso.Prefiro esse método aos mencionados, porque não depende de terceiros para analisar o código (por exemplo: eval / JSON.parse), que é um exagero em minha mente, é curto o suficiente para não exigir uma função de utilitário e mantém outras convenções de truthey / falsey.
fonte
outra solução. jsFiddle
casos de teste executados no nó
fonte
Santo Deus, algumas dessas respostas são simplesmente selvagens. Eu amo JS e seu número infinito de maneiras de criar um bool.
Minha preferência, que fiquei chocado ao não ver, é:
fonte
One Liner
Nós apenas precisamos considerar a string "false", já que qualquer outra string (incluindo "true") já é
true
.Teste
Uma versão mais exaustiva
Teste
fonte