Javascript - это слабо типизированный язык, поэтому типы типов выполняются во время выполнения всякий раз, когда интерпретатор считает, что это необходимо. Если вы сравните целое число со строкой, это показывает, что они должны быть одного типа, например, «34» == 34 - это истина, поскольку целое число, вероятно, будет приведено к типу перед строкой.
Строка "false" не приведена к типу в bool, вместо этого строка bool false приведена к типу строки, которая фактически будет иметь значение "0", то есть строку, содержащую число 0, что дает "0" == "ложь", что, очевидно, ложно.
Если вы хотите сравнить значение без автоматической приведения типов, эффективно сравнивая типы и значения, используйте тройное равенство:
5 === "5" ложь
"string" === "string" true