Kann ich eine Zeichenfolge, die einen booleschen Wert darstellt (z. B. 'true', 'false'), in einen intrinsischen Typ in JavaScript konvertieren?
Ich habe ein verstecktes Formular in HTML, das basierend auf der Auswahl eines Benutzers in einer Liste aktualisiert wird. Dieses Formular enthält einige Felder, die boolesche Werte darstellen und dynamisch mit einem intrinsischen booleschen Wert gefüllt werden. Sobald dieser Wert jedoch in das ausgeblendete Eingabefeld eingefügt wird, wird er zu einer Zeichenfolge.
Die einzige Möglichkeit, den booleschen Wert des Felds zu ermitteln, nachdem es in eine Zeichenfolge konvertiert wurde, bestand darin, vom Literalwert seiner Zeichenfolgendarstellung abzuhängen.
var myValue = document.myForm.IS_TRUE.value;
var isTrueSet = myValue == 'true';
Gibt es einen besseren Weg, dies zu erreichen?
quelle
string=(string==String(string?true:false))?(string?true:false):(!string?true:false);
function parseBool(val) { return val === true || val === "true" }
function checkBool(x) { if(x) {return true;} else {return false;} }
if (checkBool(x) != false) { ... } else { ... }
!!(parseInt(value) || value === "true")
Antworten:
Tun:
Sie können es strenger gestalten, indem Sie den Identitätsoperator (
===
) verwenden, der keine impliziten Typkonvertierungen durchführt, wenn die verglichenen Variablen unterschiedliche Typen haben, anstelle des Gleichheitsoperators (==
).Nicht:
Sie sollten wahrscheinlich vorsichtig sein, wenn Sie diese beiden Methoden für Ihre spezifischen Anforderungen verwenden:
Jede Zeichenfolge, die nicht die leere Zeichenfolge ist,
true
wird mithilfe dieser ausgewertet . Obwohl sie die saubersten Methoden sind, die ich mir für die boolesche Konvertierung vorstellen kann, sind sie meiner Meinung nach nicht das, wonach Sie suchen.quelle
myValue === 'true';
ist genau gleichbedeutend mitmyValue == 'true';
. Es gibt keinen Vorteil bei der Verwendung===
über==
hier.===
und!==
wann immer es Sinn macht, was fast immer der Fall ist.==
vs.-===
Szenario ist eines der wenigen, in denen ich es nicht tue. Ich bin völlig anderer Meinung, dass es "fast immer" Sinn macht, es zu benutzen===
. Es gibt lose typisierte Sprachen , weil wir uns nicht um den Typ kümmern wollen. Wenn wir so etwas überprüfen, istif (price >= 50)
es uns egal, ob es als Zeichenfolge begann. Ich sage, die meiste Zeit wollen wir, dass Typen jongliert werden. In den seltenen Fällen, in denen wir kein Typ-Jonglieren wollen (z. B.if (price === null)
), verwenden wir===
. Das habe ich jahrelang gemacht und ich hatte nie ein Problem.Warnung
Diese hoch bewertete Legacy-Antwort ist technisch korrekt, deckt jedoch nur ein ganz bestimmtes Szenario ab, wenn Ihr Zeichenfolgenwert GENAU
"true"
oder ist"false"
.Eine ungültige JSON-Zeichenfolge, die an die folgenden Funktionen übergeben wird, löst eine Ausnahme aus .
Ursprüngliche Antwort:
Wie wäre es mit?
oder mit jQuery
quelle
JSON.parse("TRUE".toLowerCase())
damit es richtig analysiert werden kann.'true'.length === 4
?typeof str==="string"
&&str.length===4
&&str.charAt(0)==="t" && str.charAt(1)==="r" && str.charAt(2)==="u" && str.charAt(3)==="e"
&&true===true && true!==false && false===false
// nur um sicher zu gehenquelle
"true"
, auf"yes"
und zu testen"1"
. 2)toLowerCase
kehrt nicht zurücknull
. 3)Boolean(string)
ist das gleiche wiestring!==""
hier. =>switch(string.toLowerCase()) {case "false": case "no": case "0": case "": return false; default: return true;}
false
stattdessen.default: return true;
ist sicherlich möglich. Aber es würde das Verhalten der Funktion ändern.Ich denke, das ist sehr universell:
if (String(a) == "true")
...Es geht:
quelle
String(a).toLowerCase() === 'true'
String("what about input like this that isn't a bool?") == "true"
String()
Konstruktor nicht verwendet wird :true+'' === 'true' // true
Denken Sie daran, den Fall abzugleichen:
Wenn es sich um ein Kontrollkästchen für Formularelemente handelt, können Sie auch feststellen, ob das Kontrollkästchen aktiviert ist:
Angenommen, wenn es aktiviert ist, wird es gleich true "gesetzt". Dies wird als wahr / falsch bewertet.
quelle
myValue
passiert zu seinnull
,true
oder eine andere Art ...Sie können reguläre Ausdrücke verwenden:
Wenn Sie die String-Klasse erweitern möchten, können Sie Folgendes tun:
Für diejenigen (siehe Kommentare), die das String-Objekt erweitern möchten, um dies zu erhalten, sich jedoch Sorgen über die Aufzählbarkeit und über Konflikte mit anderem Code machen, der das String-Objekt erweitert:
(Funktioniert natürlich nicht in älteren Browsern und Firefox zeigt false an, während Opera, Chrome, Safari und IE true anzeigen . Bug 720760 )
quelle
Object.defineProperty
.parseBool
Wood-Eye sei vorsichtig. Nachdem ich die Konsequenzen gesehen habe, nachdem ich die Top-Antwort mit mehr als 500 Upvotes angewendet habe, fühle ich mich verpflichtet, etwas zu posten, das tatsächlich nützlich ist:
Beginnen wir mit dem kürzesten, aber sehr strengen Weg:
Und beenden Sie mit einem angemessenen, toleranteren Weg:
Testen:
quelle
false
booleschen Wert umzuwandelnJSON.parse
? In Bezug auf CPU, SpeicherleistungIch dachte, dass @Stevens Antwort die beste war, und kümmerte mich um viel mehr Fälle, als wenn der eingehende Wert nur eine Zeichenfolge wäre. Ich wollte es etwas erweitern und Folgendes anbieten:
Es ist nicht erforderlich, alle
false
Fälle abzudecken, wenn Sie bereits alletrue
Fälle kennen, die Sie berücksichtigen müssten. Sie können alles an diese Methode übergeben, was für einentrue
Wert übergeben werden könnte (oder andere hinzufügen, es ist ziemlich einfach), und alles andere wird berücksichtigtfalse
quelle
autocomplete="on"
Universelle Lösung mit JSON-Analyse:
UPDATE (ohne JSON):
Ich habe auch Geige erstellt, um es zu testen http://jsfiddle.net/remunda/2GRhG/
quelle
getBool(undefined)
stürzt ab Bei Verwendung der ursprünglichen JSON-Version wird für die 2. Version true zurückgegeben. Hier ist eine dritte Version, die false zurückgibt: function getBool (val) {var num; return val! = null && (! isNaN (num = + val)? !! num: !! String (val) .toLowerCase (). replace (!! 0, '')); }Ihre Lösung ist in Ordnung.
Die Verwendung
===
wäre in diesem Fall einfach albern, da das Feldvalue
immer ein Feld sein wirdString
.quelle
===
? In Bezug auf die Leistung wäre es genau das gleiche, wenn beide Typen Strings sind. Jedenfalls benutze ich lieber,===
da ich die Verwendung von==
und immer vermeide!=
. Begründung: stackoverflow.com/questions/359494/…value
wird immerstring
weder==
noch===
dumm sein. Beide sind das richtige Werkzeug für diesen Job. Sie unterscheiden sich nur, wenn die Typen nicht gleich sind. In diesem Fall wird===
einfach zurückgegeben,false
während==
vor dem Vergleich ein komplizierter Typ-Zwangsalgorithmus ausgeführt wird.Dies gibt
false
für jeden falsy Wert undtrue
für jeden truthy Wert mit Ausnahme'false'
,'f'
,'no'
,'n'
, und'0'
(Groß- und Kleinschreibung).quelle
Das Boolesche Objekt verfügt nicht über eine Analysemethode.
Boolean('false')
Gibt true zurück, sodass dies nicht funktioniert.!!'false'
kehrt auch zurücktrue
, so dass das auch nicht funktioniert.Wenn Sie möchten, dass der String
'true'
einen Booleschen Werttrue
und der String'false'
einen Booleschen Wert zurückgibtfalse
, ist die einfachste Lösung die Verwendungeval()
.eval('true')
gibt true undeval('false')
false zurück. Beachten Sie jedoch die Auswirkungen auf die Leistung bei der Verwendungeval()
.quelle
var isTrueSet = (myValue === 'true');
die beste Antwort ist.eval('TRUE')
; noch einmal zu beweisen, daseval()
ist böse.JSON.parse('TRUE')
aus der folgenden Antwort ebenfalls spektakulär. Es ist ziemlich einfach, eine Fehlerbedingung in JavaScript (oder einer anderen Sprache) zu erzwingen. Um dies zu berücksichtigen, sollten Sie zuerst die Zeichenfolge normalisieren, z. B.var myValue = document.myForm.IS_TRUE.value.toLowerCase(); var isTrueSet = (myValue==='true' || myValue==='false') ? eval(myValue) : false;
.toLowerCase()
in die Antwort aufnehmen, ist mein Punkt. Ich versuche nichts zu erzwingen. GroßbuchstabenTRUE
sind häufig genug, um von vielen UI-Widgets zurückgegeben zu werden.Dies wurde der akzeptierten Antwort entnommen, aber es hat wirklich einen sehr schwachen Punkt, und ich bin schockiert, wie es zu dieser Anzahl von Upvotes kam, das Problem damit, dass Sie den Fall der Zeichenfolge berücksichtigen müssen, da dies zwischen Groß- und Kleinschreibung unterscheidet
quelle
Ich benutze folgendes:
Diese Funktion führt den üblichen booleschen Zwang mit Ausnahme der Zeichenfolgen "false" (ohne Berücksichtigung der Groß- und Kleinschreibung) und "0" aus.
quelle
Es gibt viele Antworten und es ist schwer, eine auszuwählen. In meinem Fall priorisiere ich die Leistung bei der Auswahl, also erstelle ich diesen jsPerf , von dem ich hoffe, dass er hier etwas Licht ins Dunkel bringen kann.
Kurze Ergebnisse (je höher desto besser):
Sie sind mit der entsprechenden Antwort verknüpft, in der Sie weitere Informationen (Vor- und Nachteile) zu jeder Antwort finden. speziell in den Kommentaren.
quelle
quelle
function parseBoolean
stattdessen möglicherweise eine neueDer Ausdruck, den Sie suchen, ist einfach
wie in
Dies testet
myValue
gegen einen regulären Ausdruck, ohne Berücksichtigung der Groß- und Kleinschreibung, und ändert den Prototyp nicht.Beispiele:
quelle
Um sowohl String ("true", "false") als auch Boolean in Boolean zu konvertieren
Wo
flag
kann seinquelle
Es gibt bereits so viele Antworten. In einigen Szenarien kann das Folgende jedoch hilfreich sein.
Dies kann nützlich sein, wenn man Beispiele mit nicht-booleschen Werten verwendet.
quelle
Warum versuchst du nicht so etwas?
Es wird ein Fehler zurückgegeben, wenn unabhängig vom Fall ein anderer Text als wahr oder falsch angegeben wird, und es werden die Zahlen auch als erfasst
quelle
Diese Funktion kann sowohl Zeichenfolgen als auch Boolesche Werte für true / false verarbeiten.
Demonstration unten:
quelle
Ich benutze diesen
quelle
"true"
oder isttrue
. Wenn der zweite kommt, wird dies nicht funktionieren. Ist es möglich, diesdocument.prototype
zu verwenden, wo immer wir es wollen?Zweifellos ist der einfachste Weg (vorausgesetzt, Ihre Zeichenfolge ist "wahr" oder "falsch"):
Verwenden Sie für diese Art von Konvertierungen immer den Operator === anstelle des Operators ==!
quelle
Wie @ Shadow2531 sagte, können Sie es nicht einfach direkt konvertieren. Ich würde auch vorschlagen, dass Sie neben "true" und "false" auch String-Eingaben berücksichtigen, die "wahr" und "falsch" sind, wenn Ihr Code von anderen wiederverwendet / verwendet werden soll. Das benutze ich:
quelle
Sie müssen (in Ihrem Denken) den Wert Ihrer Auswahl und die Darstellung dieses Wertes trennen.
Wählen Sie in der JavaScript-Logik einen Punkt aus, an dem sie von String-Sentinels zu nativen Typen wechseln müssen, und führen Sie dort einen Vergleich durch, vorzugsweise dort, wo er für jeden zu konvertierenden Wert nur einmal ausgeführt wird. Denken Sie daran, zu klären, was passieren muss, wenn der String-Sentinel nicht dem Skript bekannt ist (dh verwenden Sie standardmäßig true oder false?).
Mit anderen Worten, ja, Sie müssen vom Wert der Zeichenfolge abhängen. :-)
quelle
Ich gehe von dieser Frage aus, dass drei Ziele erreicht werden sollen:
Das Problem bei der Verwendung von JSON besteht darin, dass ein Javascript-Fehler auftritt. Diese Lösung ist nicht belastbar (obwohl sie 1 und 3 erfüllt):
Diese Lösung ist nicht präzise genug:
Ich arbeite daran, genau dieses Problem für Typecast.js zu lösen . Und die beste Lösung für alle drei Ziele ist diese:
Es funktioniert in vielen Fällen, schlägt nicht fehl, wenn Werte wie {} übergeben werden, und ist sehr präzise. Außerdem wird false als Standardwert zurückgegeben, anstatt undefiniert zu sein oder einen Fehler auszulösen, was bei der Entwicklung von lose typisiertem Javascript nützlicher ist. Bravo zu den anderen Antworten, die es vorgeschlagen haben!
quelle
'true'
, aber nicht für wahrheitsgemäße Eingaben als wahr zurückgegeben. Damit Ziel 1 erreicht wird, ist es nur geringfügig prägnanter als Lösung 2 und weitaus weniger lesbar.return /^(true|yes|1|t|y)$/i.test(str);
Ich bin ein wenig spät, aber ich habe ein kleines Snippet , dies zu tun, es macht im Wesentlichen alle JScripts truthey / Falsey / verdreckt -ness sondern umfasst
"false"
als acceptible Wert für falsch.Ich bevorzuge diese Methode gegenüber den genannten, da sie nicht von einem Drittanbieter zum Parsen des Codes (dh eval / JSON.parse) benötigt wird. Dies ist meiner Meinung nach übertrieben, sie ist kurz genug, um keine Dienstprogrammfunktion zu erfordern und zu warten andere Truthey / Falsey-Konventionen.
quelle
eine andere Lösung. jsFiddle
Testfälle werden im Knoten ausgeführt
quelle
Heiliger Gott, einige dieser Antworten sind einfach wild. Ich liebe JS und seine unendlichen Möglichkeiten, einen Bool zu häuten.
Meine Präferenz, die ich schockiert war, nicht schon zu sehen, ist:
quelle
Einzeiler
Wir müssen nur die "falsche" Zeichenfolge berücksichtigen, da jede andere Zeichenfolge (einschließlich "wahr") bereits vorhanden ist
true
.Prüfung
Eine exaustivere Version
Prüfung
quelle