3514 Stimmen

Wie kann ich in JavaScript eine Zeichenkette in einen Booleschen Wert umwandeln?

Kann ich eine Zeichenkette, die einen booleschen Wert repräsentiert (z. B. 'true', 'false'), in einen intrinsischen Typ in JavaScript umwandeln?

Ich habe ein verstecktes Formular in HTML, das auf der Grundlage der Auswahl eines Benutzers in einer Liste aktualisiert wird. Dieses Formular enthält einige Felder, die boolesche Werte darstellen und dynamisch mit einem eigenen booleschen Wert befüllt werden. Sobald dieser Wert jedoch in das verborgene Eingabefeld eingegeben wird, wird er zu einem String.

Die einzige Möglichkeit, den booleschen Wert des Feldes nach der Konvertierung in eine Zeichenkette zu bestimmen, bestand darin, sich auf den literalen Wert der Zeichenkettendarstellung zu verlassen.

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

Gibt es eine bessere Möglichkeit, dies zu erreichen?

0 Stimmen

Nur um ein seltsames Beispiel für die Vermeidung eines Dreifach-Gleichheits-Vergleichs hervorzuheben: Ich habe eine Funktion currentSortDirection() die zurückgibt 1 für eine aufsteigende Sortierung, 0 für eine absteigende Sortierung, und -1 für nicht gesetzt. Verwendung von while (currentSortDirection() != desiredSortDirection) { sortColumn() } funktioniert hervorragend, da -1 != true y -1 != false ...aber dies zu ändern in while (Boolean(currentSortDirection) !== ...) {...} Kräfte -1 in eine true was ein paar zusätzliche Zeilen an Vorbereitung erfordert, nur um jshint glücklich zu machen.

0 Stimmen

Mögliches Duplikat von stackoverflow.com/questions/263965

0 Stimmen

@Droogans: Was passiert, wenn desiredSortDirection wird eingestellt auf asc ? Ich weiß, dass Sie in einer kontrollierten Umgebung wahrscheinlich die Kontrolle über den Wert haben. desiredSortDirection auf aber in einer gemeinsamen Umgebung gesetzt wird, wenn die Eingabe von desiredSortDirection kann von überall und in jeder Form kommen, Typüberprüfung gegen benutzerdefinierte Objekte und defensive Programmierung kann viele Stunden der Fehlersuche sparen. Ihr Code ist absolut in Ordnung und es ist nichts daran auszusetzen. Ich weise lediglich darauf hin, dass es keine allgemeingültige Antwort/Lösung gibt und es immer vom Szenario abhängt.

4voto

hajikelist Punkte 1090

Ich habe festgestellt, dass die Verwendung von '1' und ein leerer Wert '' für boolesche Werte funktioniert weit mehr vorhersehbar als 'true' oder 'false' String-Werte ... speziell mit HTML-Formulare seit uninitialized/leere Werte in Dom-Elemente wird konsequent zu falsch, während auswerten jede Wert in ihnen wird als wahr ausgewertet.

Zum Beispiel:

<input type='button' onclick='this.value = tog(this.value);' />

<script type="text/javascript">

    function tog(off) {
        if(off) {
            alert('true, toggle to false');
            return '';
        } else {
            alert('false, toggle to true');
            return '1';
        }
    }   
</script>

Schien einfach ein einfacher Weg zu sein, bisher war es sehr konsistent/einfach... vielleicht kann jemand einen Weg finden, dies zu brechen?

4voto

Richard Torcato Punkte 2044

Es wäre schön, wenn es eine Funktion für das String-Objekt gäbe, die dies für uns erledigt, aber wir können leicht unsere eigenen Prototypen hinzufügen, um das String-Objekt zu erweitern.

Fügen Sie diesen Code irgendwo in Ihrem Projekt ein, bevor Sie ihn verwenden.

String.prototype.toBoolean = function() {
   return String(this.valueOf()).toLowerCase() === true.toString();
};

Probieren Sie es so aus:

var myValue = "false"
console.log("Bool is " + myValue.toBoolean())
console.log("Bool is " + "False".toBoolean())
console.log("Bool is " + "FALSE".toBoolean())
console.log("Bool is " + "TRUE".toBoolean())
console.log("Bool is " + "true".toBoolean())
console.log("Bool is " + "True".toBoolean())

Das Ergebnis der ursprünglichen Frage wäre dann also folgendes:

var myValue = document.myForm.IS_TRUE.value;
var isTrueSet = myValue.toBoolean();

0 Stimmen

Boolean.prototype wird in allen Browsern vollständig unterstützt

4voto

cskwg Punkte 601
/// Convert something to boolean
function toBoolean( o ) {
    if ( null !== o ) {
        let t = typeof o;
        if ( "undefined" !== typeof o ) {
            if ( "string" !== t ) return !!o;
            o = o.toLowerCase().trim();
            return "true" === o || "1" === o;
        }
    }
    return false;
}

toBoolean(false) --> false
toBoolean(true) --> true
toBoolean("false") --> false
toBoolean("true") --> true
toBoolean("TRue") --> true
toBoolean("1") --> true
toBoolean("0") --> false
toBoolean(1) --> true
toBoolean(0) --> false
toBoolean(123.456) --> true
toBoolean(0.0) --> false
toBoolean("") --> false
toBoolean(null) --> false
toBoolean() --> false

0 Stimmen

Das ist so großartig und nützlich - vielen Dank!

4voto

JW. Punkte 48942

Wenn es einen anderen Code gibt, der den booleschen Wert in eine Zeichenkette umwandelt, müssen Sie genau wissen, wie dieser Code wahre/falsche Werte speichert. Entweder das oder Sie müssen Zugriff auf eine Funktion haben, die diese Umwandlung umkehrt.

Es gibt unendlich viele Möglichkeiten, boolesche Werte in Zeichenketten darzustellen ("true", "Y", "1", usw.). Daher sollten Sie sich nicht auf einen universellen String-zu-Booleschen-Konverter wie Boolean(myValue) verlassen. Sie müssen eine Routine verwenden, die die ursprüngliche Umwandlung von Booleschen Werten in Zeichenketten rückgängig macht, was auch immer das ist.

Wenn Sie wissen, dass er wahre Boolesche Werte in "wahre" Zeichenketten umwandelt, ist Ihr Beispielcode in Ordnung. Allerdings sollten Sie === statt == verwenden, damit es keine automatische Typumwandlung gibt.

4voto

Ratan Uday Kumar Punkte 4494

In nodejs durch Verwendung von node-boolify es ist möglich

Boolesche Konvertierungsergebnisse

Boolify(true); //true
Boolify('true'); //true
Boolify('TRUE'); //null
Boolify(1); //true
Boolify(2); //null
Boolify(false); //false
Boolify('false'); //false
Boolify('FALSE'); //null
Boolify(0); //false
Boolify(null); //null
Boolify(undefined); //null
Boolify(); //null
Boolify(''); //null

7 Stimmen

Ich würde lieber keine neue Abhängigkeit in das Projekt einführen, nur um einen String in einen Boolean zu konvertieren.

0 Stimmen

Es ist sehr geringes Gewicht und auch u können validieren, ob String ist boolesch

0 Stimmen

Für eine so einfache Aufgabe wäre eine Bibliothek nicht wünschenswert, vor allem wenn die Bibliothek kontrolliert, wie ein Boolescher Wert definiert wird.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X