JavaScript: Wie wandelt man einen String in einen Boolean um?
Der Grund, warum diese Frage 111 Antworten hat, ist eine Zeile:
Boolean("false") = true
Jeder nicht-leere String ist true
Boolean("true" ) = true
Boolean("false" ) = true
Boolean("0" ) = true
Boolean("" ) = false
Boolean(" " ) = true
Boolean("null" ) = true
Boolean()
ist kein Parser. Es fragt, ob der Wert
truthy ist, und das ist
jeder String außer "". "false", "0" und sogar ein einzelnes Leerzeichen
kommen als true zurück.
Die beiden anderen Schreibweisen verhalten sich gleich, weil sie dasselbe sind:
!!"false" : true
if ("false") : taken
Der Vergleich mit dem String
cmp("true") = true cmp("TRUE") = false cmp("1") = false
s === "true" ist die akzeptierte Antwort und so weit richtig. Beachte, was sie
für dich entscheidet: "TRUE" ist false, "1" ebenfalls. Kommt deine Eingabe
aus einer Konfigurationsdatei oder von einer Checkbox, kann das gut falsch sein.
Ein toLowerCase() und ein trim() erledigen den offensichtlichen Teil:
cmp2(" True ") = true
JSON.parse, und warum nicht
JSON.parse("true" ) = true (boolean)
JSON.parse("1" ) = 1 (number)
JSON.parse("yes" ) throws: SyntaxError: Unexpected token 'y', "yes" is not valid JSON
JSON.parse("" ) throws: SyntaxError: Unexpected end of JSON input
JSON.parse("TRUE" ) throws: SyntaxError: Unexpected token 'T', "TRUE" is not valid JSON
Zwei Probleme.
JSON.parse
liefert für "1" die Zahl 1, keinen Boolean — typeof belügt also alles,
was danach kommt. Und es wirft bei allem, was kein JSON ist, einschließlich des
leeren Strings, und der ist ein realistischer Wert für ein nicht ausgefülltes
Formularfeld.
Woher diese Strings kommen
a="true" Boolean=true ==="true"=true
b="false" Boolean=true ==="true"=false
c="0" Boolean=true ==="true"=false
d="" Boolean=false ==="true"=false
Das ist ein Query-String ?a=true&b=false&c=0&d=, zurückgelesen mit
URLSearchParams.
Eine URL hat keine Typen. ?b=false kommt als String "false" an, der ist
truthy, und damit bedeutet er das Gegenteil dessen, was derjenige gemeint hat,
der die URL geschrieben hat.
localStorage
macht dasselbe: false speichern, "false" zurückbekommen. Genauso ein
data--Attribut, eine .env-Datei und die TEXT-Spalten der meisten
Datenbanktreiber.
Es kommen auch Nicht-Strings an
[] Boolean=true ==="true"=false ==true=false
{} Boolean=true ==="true"=false ==true=false
"0" Boolean=true ==="true"=false ==true=false
[] == true ist false, während Boolean([]) true ist. Welche Intuition du
zu == auch hast, sie überlebt diese Tabelle nicht — nimm es hier nicht.
Ein Konverter, der entscheidet
const toBool = (v, dflt = false) => {
if (typeof v === "boolean") return v;
const s = String(v).trim().toLowerCase();
if (["true", "1", "yes", "on"].includes(s)) return true;
if (["false", "0", "no", "off", ""].includes(s)) return false;
return dflt;
};
toBool("true")=true toBool("TRUE")=true toBool(" on ")=true toBool("1")=true
toBool("false")=false toBool("0")=false toBool("no")=false toBool("")=false
toBool("banana")=false toBool(true)=true toBool(null)=false
Die letzte Zeile ist der Punkt. "banana" ist kein Boolean, und irgendetwas
muss passieren — ein Standardwert, den du gewählt hast und im Code siehst, statt
true, weil der String zufällig nicht leer war.
Welche Strings in welche Liste gehören, entscheidest du, nicht JavaScript. Schreib es dorthin, wo der Nächste es lesen kann.
Hinweis zu Netcup (Werbung)
Der deutsche Hoster Netcup bietet unter anderem günstige und zugleich leistungsstarke Webhosting Pakete, KVM-basierte Root Server und dezidierte Server an. Mit unseren Gutscheincodes kannst du noch mehr Geld sparen (6€ bei deiner ersten Bestellung, 30% Rabatt auf alle KVM-basierten Root Server, ...).