Frage Wie kann ich eine Zeichenfolge in JavaScript boolesch konvertieren?


Kann ich eine Zeichenfolge, die einen booleschen Wert (z. B. "true", "false") darstellt, in JavaScript in einen intrinsischen Typ konvertieren?

Ich habe ein verstecktes Formular in HTML, das basierend auf einer Benutzerauswahl innerhalb einer Liste aktualisiert wird. Dieses Formular enthält einige Felder, die boolesche Werte darstellen und dynamisch mit einem intrinsischen booleschen Wert aufgefüllt sind. Sobald dieser Wert jedoch in das verborgene Eingabefeld eingegeben wird, wird er zu einer Zeichenfolge.

Der einzige Weg, den ich finden könnte, um den booleschen Wert des Feldes zu bestimmen, nachdem er in eine Zeichenkette konvertiert wurde, war, von dem Literalwert seiner Zeichenkettenrepräsentation abzuhängen.

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

Gibt es einen besseren Weg, dies zu erreichen?


1832
2017-11-05 00:13


Ursprung


Antworten:


Machen:

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

Sie könnten es strenger machen, indem Sie den Identity-Operator verwenden (===), die keine impliziten Typumwandlungen durchführt, wenn die verglichenen Variablen unterschiedliche Typen haben, anstelle des Gleichheitsoperators (==).

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

Nicht:

Du solltest möglicherweiße Seien Sie vorsichtig bei der Verwendung dieser beiden Methoden für Ihre spezifischen Bedürfnisse:

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

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

Jede Zeichenfolge, die nicht die leere Zeichenfolge ist, wird ausgewertet true indem Sie sie benutzen. Obwohl es sich um die saubersten Methoden handelt, die ich für die boolesche Konvertierung in Betracht ziehen kann, denke ich, dass sie nicht das sind, wonach du suchst.


2460



Warnung

Diese hochgradig upvoted Legacy-Antwort ist technisch korrekt, deckt aber nur ein sehr spezifisches Szenario ab, wenn Ihr String-Wert GENAU ist "true" oder "false" (MUSS auch Kleinbuchstaben sein).

Eine ungültige JSON-Zeichenfolge wurde unten an diese Funktionen übergeben Wird eine Ausnahme auslösen.


Ursprüngliche Antwort:

Wie wäre es mit?

JSON.parse("true");

oder mit 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



Ich denke, das ist sehr universell:

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

Es geht:

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

120



Sie können reguläre Ausdrücke verwenden:

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

Wenn Sie die String-Klasse erweitern möchten, können Sie Folgendes tun:

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

alert("true".bool());

Für diejenigen (siehe Kommentare), die das String-Objekt erweitern möchten, um dies zu erhalten, sich aber Sorgen über die Aufzählbarkeit machen und Bedenken haben, mit anderem Code zu kollidieren, der das String-Objekt erweitert:

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

(Funktioniert natürlich nicht in älteren Browsern und Firefox zeigt falsch an, während Opera, Chrome, Safari und IE wahr sind. Fehler 720760)


105



Denken Sie daran, den Fall anzupassen:

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

Wenn es ein Formularelement-Kontrollkästchen ist, können Sie auch feststellen, ob das Kontrollkästchen aktiviert ist:

var isTrueSet = document.myForm.IS_TRUE.checked;

Angenommen, dass, wenn es aktiviert ist, es "set" gleich True ist. Dies wird als wahr / falsch gewertet.


103



Holzauge sei vorsichtig. Nachdem ich die Konsequenzen nach der Anwendung der Top-Antwort mit über 500 Upvotes gesehen habe, fühle ich mich verpflichtet, etwas zu veröffentlichen, was tatsächlich nützlich ist:

Beginnen wir mit dem kürzesten, aber sehr strengen Weg:

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

Und enden Sie mit einem richtigen, toleranteren Weg:

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

Testen:

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



Deine Lösung ist in Ordnung.

Verwenden === wäre in diesem Fall nur dumm, wie das Feld ist value wird immer ein sein String.


29