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.

10voto

Adam Pietrasiak Punkte 11497

Ich benutze diese hier

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"

0 Stimmen

Das ist gut, funktioniert aber nur mit dem Typ String. Stellen Sie sich vor, dass dies von einer Variablen verwendet werden muss, die vielleicht "true" o true . Wenn die zweite kommen, wird dies nicht funktionieren. Ist möglich machen eine document.prototype wo auch immer wir sie einsetzen wollen?

0 Stimmen

Das sieht elegant aus. Tolle Arbeit! Allerdings ist mir aufgefallen, dass das Überladen von grundlegenden Prototypen in großen JS-Anwendungen (die auch Unit-Tests benötigen) zu einem unerwarteten Verhalten führen kann (nämlich, wenn Sie mit "for" durch ein Array iterieren wollen, das den Prototyp überladen hat, erhalten Sie einige Eigenschaften, die Sie normalerweise nicht erwarten würden). Sie sind gewarnt. ;)

0 Stimmen

Eine Variante von Ihnen, die auch Boolean akzeptiert function StringOrElse2Bool(sob){ if (typeof sob === "string") { return ["no", "false", "0", "off"].indexOf( sob.toLowerCase() ) !== -1 ? false : true; } else { return !!sob }

9voto

vbranden Punkte 5316

Eine andere Lösung. 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
};

Testfälle im Knoten ausgeführt

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

9voto

staticsan Punkte 29057

Sie müssen (in Ihrem Denken) den Wert Ihrer Auswahlen und die Darstellung dieses Wertes trennen.

Wählen Sie einen Punkt in der JavaScript-Logik, wo sie von String-Sentinels zu nativem Typ übergehen müssen, und führen Sie dort einen Vergleich durch, vorzugsweise dort, wo er nur einmal für jeden Wert durchgeführt wird, der konvertiert werden muss. Denken Sie daran, was passieren soll, wenn der String-Sentinel dem Skript nicht bekannt ist (d. h. wird standardmäßig true oder false verwendet?)

Mit anderen Worten, ja, Sie müssen sich auf den Wert der Zeichenkette verlassen :-)

8voto

OhkaBaka Punkte 337

Heiliger Gott, einige dieser Antworten sind einfach wild. Ich liebe JS und seine unendliche Anzahl von Möglichkeiten, einen Bool zu häuten.

Ich war schockiert, dass ich das nicht schon gesehen habe:

testVar = testVar.toString().match(/^(true|[1-9][0-9]*|[0-9]*[1-9]+|yes)$/i) ? true : false;

8voto

imjustmatthew Punkte 176

Wie @Shadow2531 sagte, können Sie es nicht einfach direkt konvertieren. Ich würde auch vorschlagen, dass du neben "true" und "false" auch andere String-Eingaben in Betracht ziehst, die "truthy" und "falsey" sind, wenn dein Code von anderen wiederverwendet/genutzt werden soll. Dies ist, was ich verwende:

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

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