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.

3voto

Versuchen Sie diese Lösung (sie funktioniert hervorragend!):

function convertStrToBool(str)
    {
        switch(String(str).toLowerCase())
            {
                case 'undefined': case 'null': case 'nan': case 'false': case 'no': case 'f': case 'n': case '0': case 'off': case '':
                    return false;
                    break;
                default:
                    return true;
            };
    };

3voto

Eugene Tiurin Punkte 3709

Der schnellste sichere Weg, eine Zeichenkette in einer Zeile Code in einen Booleschen Wert umzuwandeln

Eine der Funktionen, die helfen, die Codeausführung in Javascript zu beschleunigen, ist Kurzschluss-Auswertung :

Da logische Ausdrücke von links nach rechts ausgewertet werden, werden sie anhand der folgenden Regeln auf eine mögliche "Kurzschluss"-Auswertung geprüft:

  • false && (irgendetwas) wird als Kurzschluss zu false ausgewertet.
  • true || (irgendetwas) wird in einem Kurzschluss als true ausgewertet.

Wenn Sie also einen Zeichenkettenwert daraufhin testen wollen, ob er true de false en JSON.parse zu testen und die Leistung aufrechtzuerhalten, können Sie die || Operator, um den langsamen Code von der Ausführung auszuschließen, wenn der Testwert vom Typ Boolean ist.

test === true || ['true','yes','1'].indexOf(test.toString().toLowerCase()) > -1

Da die Array.prototype.indexOf() Methode ist ein Teil von ECMA-262 Standard in der 5. Auflage, benötigen Sie möglicherweise eine Polyfill für die Unterstützung der alten Browser.

// Production steps of ECMA-262, Edition 5, 15.4.4.14
// Reference: http://es5.github.io/#x15.4.4.14
if (!Array.prototype.indexOf) {
  Array.prototype.indexOf = function(searchElement, fromIndex) {

    var k;

    // 1. Let O be the result of calling ToObject passing
    //    the this value as the argument.
    if (this == null) {
      throw new TypeError('"this" is null or not defined');
    }

    var O = Object(this);

    // 2. Let lenValue be the result of calling the Get
    //    internal method of O with the argument "length".
    // 3. Let len be ToUint32(lenValue).
    var len = O.length >>> 0;

    // 4. If len is 0, return -1.
    if (len === 0) {
      return -1;
    }

    // 5. If argument fromIndex was passed let n be
    //    ToInteger(fromIndex); else let n be 0.
    var n = +fromIndex || 0;

    if (Math.abs(n) === Infinity) {
      n = 0;
    }

    // 6. If n >= len, return -1.
    if (n >= len) {
      return -1;
    }

    // 7. If n >= 0, then Let k be n.
    // 8. Else, n<0, Let k be len - abs(n).
    //    If k is less than 0, then let k be 0.
    k = Math.max(n >= 0 ? n : len - Math.abs(n), 0);

    // 9. Repeat, while k < len
    while (k < len) {
      // a. Let Pk be ToString(k).
      //   This is implicit for LHS operands of the in operator
      // b. Let kPresent be the result of calling the
      //    HasProperty internal method of O with argument Pk.
      //   This step can be combined with c
      // c. If kPresent is true, then
      //    i.  Let elementK be the result of calling the Get
      //        internal method of O with the argument ToString(k).
      //   ii.  Let same be the result of applying the
      //        Strict Equality Comparison Algorithm to
      //        searchElement and elementK.
      //  iii.  If same is true, return k.
      if (k in O && O[k] === searchElement) {
        return k;
      }
      k++;
    }
    return -1;
  };
}

3voto

Yuriy Litvin Punkte 71

Für TypeScript können wir die Funktion verwenden:

export function stringToBoolean(s: string, valueDefault: boolean = false): boolean {
    switch(s.toLowerCase())
    {
        case "true":
        case "1":
        case "on":
        case "yes":
        case "y":
            return true;

        case "false":
        case "0":
        case "off":
        case "no":
        case "n":
            return false;
    }

    return valueDefault;
}

3voto

user3638793 Punkte 41

Hier ist mein 1-Zeilen-Beitrag: Ich musste eine Zeichenkette auswerten und ausgeben, true, wenn 'true', false, wenn 'false' und eine Zahl, wenn etwas wie '-12.35673'.

val = 'false';

val = /^false$/i.test(val) ? false : ( /^true$/i.test(val) ? true : val*1 ? val*1 : val );

3voto

Mahes Punkte 3580

Einfache Lösung, die ich schon eine Weile benutze

function asBoolean(value) {

    return (''+value) === 'true'; 

}

// asBoolean(true) ==> true
// asBoolean(false) ==> false
// asBoolean('true') ==> true
// asBoolean('false') ==> false

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