Pregunta ¿Cómo puedo convertir una cadena a booleana en JavaScript?


¿Puedo convertir una cadena que represente un valor booleano (por ejemplo, 'verdadero', 'falso') en un tipo intrínseco en JavaScript?

Tengo un formulario oculto en HTML que se actualiza según la selección de un usuario dentro de una lista. Este formulario contiene algunos campos que representan valores booleanos y se rellenan dinámicamente con un valor booleano intrínseco. Sin embargo, una vez que este valor se coloca en el campo de entrada oculto se convierte en una cadena.

La única forma que pude encontrar para determinar el valor booleano del campo, una vez que se convirtió en una cadena, fue depender del valor literal de su representación de cadena.

var myValue = document.myForm.IS_TRUE.value;
var isTrueSet = myValue == 'true';

¿Hay una mejor manera de lograr esto?


1832
2017-11-05 00:13


origen


Respuestas:


Hacer:

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

Puede hacerlo más estricto utilizando el operador de identidad (===), que no realiza ninguna conversión de tipo implícita cuando las variables comparadas tienen tipos diferentes, en lugar del operador de igualdad (==)

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

No hacer:

Probablemente deberías tenga cuidado al usar estos dos métodos para sus necesidades específicas:

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

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

Cualquier cadena que no sea la cadena vacía evaluará a true usándolos. Aunque son los métodos más limpios que se me ocurren en relación con la conversión booleana, creo que no son lo que estás buscando.


2460



Advertencia

Esta respuesta heredada altamente modificada es técnicamente correcta, pero solo cubre un escenario muy específico, cuando el valor de su cadena es EXACTAMENTE "true" o "false" (DEBE ser minúsculo también).

Una cadena json no válida pasa a estas funciones a continuación Lanzará una excepción.


Respuesta original:

¿Qué tal si?

JSON.parse("true");

o con jQuery

$.parseJSON("true");

516



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);
    }
}

186



Creo que esto es muy universal:

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

Va:

String(true) == "true"     //returns true
String(false) == "true"    //returns false
String("true") == "true"   //returns true
String("false") == "true"  //returns false

120



Puedes usar expresiones 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);
}

Si le gusta extender la clase String, puede hacer:

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

alert("true".bool());

Para aquellos (ver los comentarios) que desean extender el objeto String para obtener esto, pero les preocupa la enumerabilidad y les preocupa chocar con otro código que amplíe el objeto String:

Object.defineProperty(String.prototype, "com_example_bool", {
    get : function() {
        return (/^(true|1)$/i).test(this);
    }
});
alert("true".com_example_bool);

(Por supuesto, no funcionará en navegadores antiguos y Firefox muestra falso mientras que Opera, Chrome, Safari e IE se muestran como verdaderos. Error 720760)


105



Recuerde hacer coincidir el caso:

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

Además, si se trata de una casilla de verificación de elemento de formulario, también puede detectar si la casilla de verificación está marcada:

var isTrueSet = document.myForm.IS_TRUE.checked;

Suponiendo que si está marcada, se "configura" igual a verdadero. Esto se evalúa como verdadero / falso.


103



Wood-eye ten cuidado. Después de ver las consecuencias después de aplicar la respuesta principal con más de 500 votos positivos, me siento obligado a publicar algo que es realmente útil:

Comencemos con la forma más breve, pero muy estricta:

var str = "true";
var mybool = JSON.parse(str);

Y termine con una forma adecuada y más 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;
}

Pruebas:

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