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, ...).