Javascript ist eine lose typisierte Sprache, so dass Typecasts zur Laufzeit durchgeführt werden, wann immer der Interpreter es für nötig hält. Wenn Sie eine ganze Zahl mit einer Zeichenkette vergleichen, geht er davon aus, dass sie vom gleichen Typ sein sollten, so dass zum Beispiel "34" == 34 wahr ist, da die ganze Zahl vor dem Vergleich wahrscheinlich in eine Zeichenkette typisiert würde.
Die Zeichenkette "false" wird nicht in eine bool-Zeichenkette umgewandelt, sondern die bool-Zeichenkette false wird in eine Zeichenkette umgewandelt, die eigentlich den Wert "0" hätte, d.h. eine Zeichenkette, die die Zahl 0 enthält, was "0" == "false" ergibt, was offensichtlich falsch ist.
Wenn Sie den Wert ohne automatische Typisierung vergleichen wollen, also nicht nur Werte, sondern auch Typen vergleichen wollen, verwenden Sie ein dreifaches equal:
5 === "5" falsch "string" === "string" true