Domanda Come posso convertire una stringa in boolean in JavaScript?


Posso convertire una stringa che rappresenta un valore booleano (ad es., 'True', 'false') in un tipo intrinseco in JavaScript?

Ho un modulo nascosto in HTML che viene aggiornato in base alla selezione di un utente all'interno di un elenco. Questo modulo contiene alcuni campi che rappresentano valori booleani e sono popolati dinamicamente con un valore booleano intrinseco. Tuttavia, quando questo valore viene inserito nel campo di input nascosto diventa una stringa.

L'unico modo per trovare il valore booleano del campo, una volta convertito in una stringa, era dipendere dal valore letterale della sua rappresentazione di stringa.

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

C'è un modo migliore per realizzare questo?


1831
2017-11-05 00:13


origine


risposte:


Fare:

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

Puoi renderlo più rigoroso usando l'operatore di identità (===), che non effettua conversioni di tipo implicite quando le variabili confrontate hanno tipi diversi, invece dell'operatore di uguaglianza (==).

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

Non:

Probabilmente dovresti sii cauto nell'usare questi due metodi per le tue esigenze specifiche:

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

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

Qualsiasi stringa che non è la stringa vuota valuterà true usando loro. Anche se sono i metodi più puliti che riesco a pensare riguardo alla conversione booleana, penso che non siano ciò che stai cercando.


2456



avvertimento

Questa risposta legacy altamente pubblicizzata è tecnicamente corretta, ma copre solo uno scenario molto specifico, quando il valore della stringa è ESATTAMENTE "true" o "false" (DEVE essere anche in minuscolo).

Di seguito una stringa json non valida passata in queste funzioni Lancia un'eccezione.


Risposta originale:

Che ne dite di?

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



Penso che questo sia molto universale:

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



Puoi usare le espressioni regolari:

/*
 * 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 ti piace estendere la classe String puoi fare:

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

alert("true".bool());

Per quelli (vedi i commenti) che vorrebbero estendere l'oggetto String per ottenere questo, ma sono preoccupati per l'enumerabilità e sono preoccupati per lo scontro con altri codici che estendono l'oggetto String:

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

(Naturalmente non funziona con i browser più vecchi e Firefox mostra false mentre Opera, Chrome, Safari e IE mostrano true. Bug 720760)


105



Ricorda di abbinare il caso:

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

Inoltre, se si tratta di una casella di controllo di un elemento del modulo, puoi anche rilevare se la casella di controllo è selezionata:

var isTrueSet = document.myForm.IS_TRUE.checked;

Supponendo che se è selezionato, è "impostato" uguale a true. Questo è vero / falso.


103



Wood-eye stai attento. Dopo aver visto le conseguenze dopo aver applicato la risposta superiore con oltre 500 upvotes, mi sento obbligato a pubblicare qualcosa che sia effettivamente utile:

Iniziamo con il modo più breve, ma molto rigoroso:

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

E termina con un modo corretto e più tollerante:

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

test:

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



La tua soluzione va bene.

utilizzando === sarebbe semplicemente sciocco in questo caso, come del campo value sarà sempre un String.


29