Почему вкладка равна ложь в JavaScript?

Я думал, что знаю о причудах с == и всех странных типах в JavaScript, но сегодня я наткнулся на одну вещь, которая не имеет для меня никакого смысла:

'\t' == false
// => true

Почему это?

По-видимому, '\t' не является ложным значением, и в сочетании с || оно работает так, как ожидается:

'\t' || 42
// => '\t'

С другой стороны, toString также не вызывается false, см.:

'\t' == 'false'
// => false

Это привело меня к мысли, что вкладка может быть преобразована в логическое значение, но:

Boolean('\t') == false
// => false

Итак, вопрос: почему это так?

Ответ 1

См. Сравнение абстрактного равенства::

Сравнение x == y, где x и y являются значениями, дает истину или ложь. Такое сравнение выполняется следующим образом:

Итак, в вашей ситуации x - это строка, а y - логическое значение. Первое условие, которое выполняется здесь:

  1. Если тип (y) является логическим, возвращает результат сравнения x == ToNumber(y).

Превращение чека в

'\t' == 0

Который затем выполняет:

  1. Если Type (x) равен String, а Type (y) равен Number, вернуть результат сравнения ToNumber (x) == y.

И ToNumber('\t') === 0:

console.log(Number('\t'));