Como posso converter uma string para boolean em JavaScript?

posso converter uma string representando um valor booleano (por exemplo, 'true', 'false') em um tipo intrínseco em JavaScript?

Tenho uma forma escondida no HTML que é actualizada com base na selecção de um utilizador dentro de uma lista. Esta forma contém alguns campos que representam valores booleanos e são dinamicamente povoados com um valor booleano intrínseco. No entanto, uma vez que este valor é colocado no campo de entrada escondido, ele se torna uma string.

A única maneira que encontrei para determinar o campo ... o valor booleano, uma vez convertido em uma cadeia, dependeria do valor literal de sua representação de cadeia.

var myValue = document.myForm.IS_TRUE.value;
var isTrueSet = myValue == 'true';
Há uma maneira melhor de conseguir isto?

 1907
Author: Kevin , 2008-11-05

30 answers

Faça:

var isTrueSet = (myValue == 'true');

Você poderia torná-lo mais rigoroso usando o operador de identidade (===), o que não faz qualquer tipo implícito conversões quando as variáveis comparadas têm tipos diferentes, em vez do operador de igualdade (==).

var isTrueSet = (myValue === 'true');

Não:

Você deve provavelmente ser cauteloso sobre a utilização destes dois métodos para as suas necessidades específicas:

var myBool = Boolean("false");  // == true

var myBool = !!"false";  // == true

Qualquer texto que não seja o texto vazio irá avaliar para true usando-os. Embora são os métodos mais limpos que consigo pensar em relação à conversão booleana, acho que não são o que procuras.

 2553
Author: guinaps, 2018-04-25 17:32:46

Aviso

Esta resposta altamente ascendente é tecnicamente correcta, mas apenas cobre um cenário muito específico, quando o seu valor de cadeia de caracteres é exactamente "true" ou "false" (deve ser minúscula também).

Uma cadeia JSON inválida passou para estas funções abaixo irá abrir uma excepção .


Resposta Original:

Que tal?
JSON.parse("true");

Ou com jQuery

$.parseJSON("true");
 531
Author: Luke, 2017-11-08 00:04:23
stringToBoolean: function(string){
    switch(string.toLowerCase().trim()){
        case "true": case "yes": case "1": return true;
        case "false": case "no": case "0": case null: return false;
        default: return Boolean(string);
    }
}
 189
Author: 2 revs, 2 users 92%Steven, 2015-08-30 07:00:25
Acho que isto é muito universal.

if (String(a) == "true") ...

Diz:

String(true) == "true"     //returns true
String(false) == "true"    //returns false
String("true") == "true"   //returns true
String("false") == "true"  //returns false
 122
Author: 4 revs, 3 users 70%ander, 2016-02-10 10:15:19

Pode usar expressões regulares:

/*
 * Converts a string to a bool.
 *
 * This conversion will:
 *
 *  - match 'true', 'on', or '1' as true.
 *  - ignore all white-space padding
 *  - ignore capitalization (case).
 *
 * '  tRue  ','ON', and '1   ' will all evaluate as true.
 *
 */
function strToBool(s)
{
    // will match one and only one of the string 'true','1', or 'on' rerardless
    // of capitalization and regardless off surrounding white-space.
    //
    regex=/^\s*(true|1|on)\s*$/i

    return regex.test(s);
}

Se gosta de alargar a classe de texto, pode fazer:

String.prototype.bool = function() {
    return strToBool(this);
};

alert("true".bool());

Para aqueles (ver comentários) que gostariam de estender o objeto de Cadeia de caracteres para obter isso, mas estão preocupados sobre enumerability e estão preocupados em confronto com outro código que estende o objeto de Cadeia de caracteres:

Object.defineProperty(String.prototype, "com_example_bool", {
    get : function() {
        return (/^(true|1)$/i).test(this);
    }
});
alert("true".com_example_bool);
(Não vai funcionar em navegadores mais antigos, claro, e o Firefox mostra falso enquanto o Opera, o Chrome, o Safari e o IE mostram verdadeiro. Insecto 720760)
 106
Author: shrewmouse, 2018-04-13 16:28:39

Lembre-se de combinar o caso:

var isTrueSet = (myValue.toLowerCase() === 'true');

Também, se for uma opção do elemento form, Poderá também detectar se a opção estiver assinalada:

var isTrueSet = document.myForm.IS_TRUE.checked;

Assumindo que se estiver assinalado, é "definido" igual a verdadeiro. Isto é considerado verdadeiro / falso.

 105
Author: Jared Farrish, 2008-11-05 03:04:34

Wood-eye tem cuidado. Depois de ver as consequências depois de aplicar a resposta superior com 500 + upvotes, sinto-me obrigado a postar algo que é realmente útil:

Vamos começar pelo caminho mais curto, mas muito rigoroso.
var str = "true";
var mybool = JSON.parse(str);

E terminar com uma maneira adequada e mais tolerante:

var parseBool = function(str) 
{
    // console.log(typeof str);
    // strict: JSON.parse(str)

    if(str == null)
        return false;

    if (typeof str === 'boolean')
    {
        return (str === true);
    } 

    if(typeof str === 'string')
    {
        if(str == "")
            return false;

        str = str.replace(/^\s+|\s+$/g, '');
        if(str.toLowerCase() == 'true' || str.toLowerCase() == 'yes')
            return true;

        str = str.replace(/,/g, '.');
        str = str.replace(/^\s*\-\s*/g, '-');
    }

    // var isNum = string.match(/^[0-9]+$/) != null;
    // var isNum = /^\d+$/.test(str);
    if(!isNaN(str))
        return (parseFloat(str) != 0);

    return false;
}

Teste:

var array_1 = new Array(true, 1, "1",-1, "-1", " - 1", "true", "TrUe", "  true  ", "  TrUe", 1/0, "1.5", "1,5", 1.5, 5, -3, -0.1, 0.1, " - 0.1", Infinity, "Infinity", -Infinity, "-Infinity"," - Infinity", " yEs");

var array_2 = new Array(null, "", false, "false", "   false   ", " f alse", "FaLsE", 0, "00", "1/0", 0.0, "0.0", "0,0", "100a", "1 00", " 0 ", 0.0, "0.0", -0.0, "-0.0", " -1a ", "abc");


for(var i =0; i < array_1.length;++i){ console.log("array_1["+i+"] ("+array_1[i]+"): " + parseBool(array_1[i]));}

for(var i =0; i < array_2.length;++i){ console.log("array_2["+i+"] ("+array_2[i]+"): " + parseBool(array_2[i]));}

for(var i =0; i < array_1.length;++i){ console.log(parseBool(array_1[i]));}
for(var i =0; i < array_2.length;++i){ console.log(parseBool(array_2[i]));}
 39
Author: Stefan Steiger, 2016-06-22 03:06:06
A sua solução está óptima.

Usar {[[0]} seria uma tolice neste caso, pois o campo value será sempre um String.

 29
Author: Jonny Buchanan, 2008-11-05 01:12:11

Solução Universal com JSON parse:

function getBool(val) {
    return !!JSON.parse(String(val).toLowerCase());
}

getBool("1"); //true
getBool("0"); //false
getBool("true"); //true
getBool("false"); //false
getBool("TRUE"); //true
getBool("FALSE"); //false

Actualização (sem JSON):

function getBool(val){ 
    var num = +val;
    return !isNaN(num) ? !!num : !!String(val).toLowerCase().replace(!!0,'');
}
Também criei violino para testá-lo. http://jsfiddle.net/remunda/2GRhG/
 26
Author: Jan Remunda, 2014-07-23 14:00:51

Eu pensei que a resposta de @Steven era a melhor, e cuidava de muito mais casos do que se o valor recebido fosse apenas uma corda. Eu queria estendê-lo um pouco e oferecer o seguinte:

function isTrue(value){
    if (typeof(value) === 'string'){
        value = value.trim().toLowerCase();
    }
    switch(value){
        case true:
        case "true":
        case 1:
        case "1":
        case "on":
        case "yes":
            return true;
        default: 
            return false;
    }
}

Não é necessário cobrir todos os casos false se já conheces todos os casos true pelos quais terias de contar. Você pode passar qualquer coisa para este método que poderia passar por um valor true (ou adicionar outros, é bastante simples), e tudo o resto seria considerado false

 23
Author: BrDaHa, 2017-11-21 00:42:40
var falsy = /^(?:f(?:alse)?|no?|0+)$/i;
Boolean.parse = function(val) { 
    return !falsy.test(val) && !!val;
};

Isto devolve false por cada valor falso e true por cada valor verdadeiro, excepto para 'false', 'f', 'no', 'n', e '0' (insensível a maiúsculas).

// False
Boolean.parse(false);
Boolean.parse('false');
Boolean.parse('False');
Boolean.parse('FALSE');
Boolean.parse('f');
Boolean.parse('F');
Boolean.parse('no');
Boolean.parse('No');
Boolean.parse('NO');
Boolean.parse('n');
Boolean.parse('N');
Boolean.parse('0');
Boolean.parse('');
Boolean.parse(0);
Boolean.parse(null);
Boolean.parse(undefined);
Boolean.parse(NaN);
Boolean.parse();

//True
Boolean.parse(true);
Boolean.parse('true');
Boolean.parse('True');
Boolean.parse('t');
Boolean.parse('yes');
Boolean.parse('YES');
Boolean.parse('y');
Boolean.parse('1');
Boolean.parse('foo');
Boolean.parse({});
Boolean.parse(1);
Boolean.parse(-1);
Boolean.parse(new Date());
 21
Author: Prestaul, 2014-07-14 19:43:42

O objecto booleano não tem um método' parse'. Boolean('false') retorna verdadeiro, então isso não vai funcionar. !!'false' também devolve true, por isso isso também não vai funcionar.

Se quiser que o texto 'true' devolva o booleano true e o texto 'false' devolvam o booleano false, então a solução mais simples é usar eval(). eval('true') devolve verdadeiro e eval('false') devolve falso. Tenha em mente as implicações de desempenho ao usar eval() no entanto.

 17
Author: 10basetom, 2016-02-05 15:22:19

Uso o seguinte:

function parseBool(b) {
    return !(/^(false|0)$/i).test(b) && !!b;
}

Esta função executa a coerção booleana habitual, com excepção das cadeias "false" (insensível a maiúsculas) e "0".

 15
Author: zobier, 2013-07-31 03:57:57
Boolean.parse = function (str) {
  switch (str.toLowerCase ()) {
    case "true":
      return true;
    case "false":
      return false;
    default:
      throw new Error ("Boolean.parse: Cannot convert string to boolean.");
  }
};
 13
Author: Thomas Eding, 2010-01-22 00:30:07
Há muitas respostas e é difícil escolher uma. No meu caso, dou prioridade ao desempenho quando escolho, por isso crio este jsPerf que espero que possa lançar alguma luz aqui.

Breve dos resultados (quanto maior melhor):

  1. declaração condicional: 2,826,922
  2. mudar de capitalização no objecto Bool: 2,825,469
  3. elenco para JSON: 1,867,774
  4. !! conversões: 805,322
  5. protótipo do texto: 713,637

Eles estão ligados à resposta relacionada onde você pode encontrar mais informações (prós e contras) sobre cada um; especialmente nos comentários.

 12
Author: sospedra, 2017-05-23 11:47:32

A expressão que procuras é simplesmente

/^true$/i.test(myValue)

Como em

var isTrueSet = /^true$/i.test(myValue);

Este teste myValue contra uma expressão regular , insensível a maiúsculas, e não modifica o protótipo.

Exemplos:

/^true$/i.test("true"); // true
/^true$/i.test("TRUE"); // true
/^true$/i.test("tRuE"); // true
/^true$/i.test(" tRuE"); // false (notice the space at the beginning)
/^true$/i.test("untrue"); // false (some other solutions here will incorrectly return true
/^true$/i.test("false");// returns false
/^true$/i.test("xyz");  // returns false
 11
Author: AndreasPizsa, 2013-01-22 16:05:15

Já existem tantas respostas disponíveis. Mas seguir pode ser útil em alguns cenários.

// One can specify all values against which you consider truthy
var TRUTHY_VALUES = [true, 'true', 1];

function getBoolean(a) {
    return TRUTHY_VALUES.some(function(t) {
        return t === a;
    });
}

Isto pode ser útil quando um exemplo com valores não-booleanos.

getBoolean('aa'); // false
getBoolean(false); //false
getBoolean('false'); //false

getBoolean('true'); // true
getBoolean(true); // true
getBoolean(1); // true
 11
Author: Sandip Nirmal, 2016-06-03 09:37:26
{[[2]} Isto foi tirado da resposta aceite, mas realmente tem um ponto muito fraco, e estou chocado como conseguiu essa contagem de upvotes, o problema com ele que você tem que considerar o caso da string porque este é o caso sensível
var isTrueSet = (myValue.toLowerCase() === 'true');
 9
Author: Hakam Fostok, 2018-03-03 13:44:35

Baixa a maneira mais fácil (assumindo que o texto será 'verdadeiro' ou' falso') é:

var z = 'true';
var y = 'false';
var b = (z === 'true'); // will evaluate to true
var c = (y === 'true'); // will evaluate to false

sempre use o = = = operador em vez do = = operador para estes tipos de conversões!

 8
Author: risingfish, 2011-09-22 14:46:53
Como @Shadow2531 disse, Você não pode simplesmente convertê-lo diretamente. Eu também sugiro que você considere entradas de cadeia além de "verdadeiro" e "falso" que são "truthy" e "falsey" se seu código vai ser reutilizado/usado por outros. Isto é o que eu uso:
function parseBoolean(string) {
  switch (String(string).toLowerCase()) {
    case "true":
    case "1":
    case "yes":
    case "y":
      return true;
    case "false":
    case "0":
    case "no":
    case "n":
      return false;
    default:
      //you could throw an error, but 'undefined' seems a more logical reply
      return undefined;
  }
}
 8
Author: imjustmatthew, 2012-04-05 18:22:02

Para converter ambas as cadeias ("verdadeiro"," falso") E booleanas para booleanas

('' + flag) === "true"

Onde {[2] } pode ser

 var flag = true
 var flag = "true"
 var flag = false
 var flag = "false"
 8
Author: Fizer Khan, 2015-03-11 13:16:25
Estou a usar este.
String.prototype.maybeBool = function(){

    if ( ["yes", "true", "1", "on"].indexOf( this.toLowerCase() ) !== -1 ) return true;
    if ( ["no", "false", "0", "off"].indexOf( this.toLowerCase() ) !== -1 ) return false;

    return this;

}

"on".maybeBool(); //returns true;
"off".maybeBool(); //returns false;
"I like js".maybeBool(); //returns "I like js"
 8
Author: Adam Pietrasiak, 2015-12-03 18:20:03
A minha opinião sobre esta questão é que visa satisfazer três objectivos:
  • Devolve verdadeiro / falso para os valores truthy e falsey, mas também devolve verdadeiro / falso para vários valores de string que seriam truthy ou falsey se fossem booleanos em vez de strings.
  • Em segundo lugar, fornecer uma interface resistente de modo a que os valores diferentes dos especificados não falhem, mas devolvam um valor por omissão
  • Em terceiro lugar, faz tudo isto com o menor Código possível.

A o problema com o uso de JSON é que ele falha ao causar um erro de Javascript. Esta solução não é resistente (embora satisfaça 1 e 3):

JSON.parse("FALSE") // fails

Esta solução não é suficientemente concisa:

if(value === "TRUE" || value === "yes" || ...) { return true; }

Estou a trabalhar para resolver este problema EXACTO para Typecast.js . E a melhor solução para os três objectivos é esta:

return /^true$/i.test(v);

Funciona em muitos casos, não falha quando valores como {} são passados, e é muito conciso. Também devolve false como o valor por omissão ao invés de indefinido ou lançar um erro, que é mais útil no desenvolvimento de Javascript vagamente digitado. Bravo para as outras respostas que o sugeriram!

 7
Author: BishopZ, 2013-01-26 23:02:50

Eu sou um pouco tarde, mas eu tenho um pequeno trecho para fazer isso, é, essencialmente, mantém todos os JScripts truthey/falsey/imundo-ness, mas inclui "false" como um aceitáveis de valor para false.

Prefiro este método aos mencionados porque não depende de uma terceira parte para analisar o código (I. E.: eval/JSON.parse), que é exagero na minha mente, é curta o suficiente para não exigir uma função de utilidade e mantém outras convenções truthey/falsey.

var value = "false";
var result = (value == "false") != Boolean(value);

// value = "true"  => result = true
// value = "false" => result = false
// value = true    => result = true
// value = false   => result = false
// value = null    => result = false
// value = []      => result = true
// etc..
 7
Author: Dead.Rabit, 2013-08-21 10:35:11

Outra solução. jsFiddle

var toBoolean = function(value) {
    var strValue = String(value).toLowerCase();
    strValue = ((!isNaN(strValue) && strValue !== '0') &&
        strValue !== '' &&
        strValue !== 'null' &&
        strValue !== 'undefined') ? '1' : strValue;
    return strValue === 'true' || strValue === '1' ? true : false
};

Os Casos de ensaio são executados no nó

> toBoolean(true)
true
> toBoolean(false)
false
> toBoolean(undefined)
false
> toBoolean(null)
false
> toBoolean('true')
true
> toBoolean('True')
true
> toBoolean('False')
false
> toBoolean('false')
false
> toBoolean('0')
false
> toBoolean('1')
true
> toBoolean('100')
true
> 
 7
Author: vbranden, 2015-08-02 02:08:43

Esta função pode manipular o texto, assim como o verdadeiro booleano/falso.

function stringToBoolean(val){
    var a = {
        'true':true,
        'false':false
    };
    return a[val];
}

Demonstração abaixo:

function stringToBoolean(val) {
  var a = {
    'true': true,
    'false': false
  };
  return a[val];
}

console.log(stringToBoolean("true"));

console.log(typeof(stringToBoolean("true")));

console.log(stringToBoolean("false"));

console.log(typeof(stringToBoolean("false")));

console.log(stringToBoolean(true));

console.log(typeof(stringToBoolean(true)));

console.log(stringToBoolean(false));

console.log(typeof(stringToBoolean(false)));

console.log("=============================================");
// what if value was undefined? 
console.log("undefined result:  " + stringToBoolean(undefined));
console.log("type of undefined result:  " + typeof(stringToBoolean(undefined)));
console.log("=============================================");
// what if value was an unrelated string?
console.log("unrelated string result:  " + stringToBoolean("hello world"));
console.log("type of unrelated string result:  " + typeof(stringToBoolean(undefined)));
 7
Author: user1063287, 2018-09-09 05:03:21

Você precisa separar (no seu pensamento) o valor de suas seleções e a representação desse valor.

Escolha um ponto na lógica JavaScript onde eles precisam de transição de texto sentinelas para o tipo nativo e faça uma comparação lá, de preferência onde ele só é feito uma vez para cada valor que precisa ser convertido. Lembre-se de abordar o que precisa de acontecer se o texto Sentinela não é um que o script conhece (isto é, por omissão é verdadeiro ou falso?)

Em outras palavras, sim, você precisa depender do valor da string. :-)

 6
Author: staticsan, 2008-11-05 01:16:37
function parseBool(value) {
    if (typeof value === "boolean") return value;

    if (typeof value === "number") {
        return value === 1 ? true : value === 0 ? false : undefined;
    }

    if (typeof value != "string") return undefined;

    return value.toLowerCase() === 'true' ? true : false;
}
 5
Author: Cliff Mayson, 2013-10-16 02:40:22

Escrevi uma função para corresponder ao filter_var do PHP, o que faz isto muito bem. Disponível em um gist: https://gist.github.com/CMCDragonkai/7389368

/**
 * Parses mixed type values into booleans. This is the same function as filter_var in PHP using boolean validation
 * @param  {Mixed}        value 
 * @param  {Boolean}      nullOnFailure = false
 * @return {Boolean|Null}
 */
var parseBooleanStyle = function(value, nullOnFailure = false){
    switch(value){
        case true:
        case 'true':
        case 1:
        case '1':
        case 'on':
        case 'yes':
            value = true;
            break;
        case false:
        case 'false':
        case 0:
        case '0':
        case 'off':
        case 'no':
            value = false;
            break;
        default:
            if(nullOnFailure){
                value = null;
            }else{
                value = false;
            }
            break;
    }
    return value;
};
 5
Author: CMCDragonkai, 2013-11-09 20:09:43
String(true).toLowerCase() == 'true'; // true
String("true").toLowerCase() == 'true'; // true
String("True").toLowerCase() == 'true'; // true
String("TRUE").toLowerCase() == 'true'; // true

String(false).toLowerCase() == 'true'; // false

Se não tiver a certeza da entrada, a informação acima funciona para booleano e também para qualquer cadeia de caracteres.

 5
Author: Chanakya Vadla, 2017-05-16 08:34:05