Про сравнение, к сожалению, только на английском:
оператор «меньше»
- если обе части — строки, то сравниваются Unicode коды
- иначе JS попытается привести к числу не-числовые аргументы
- .. если при этом где-то получился NaN, вернёт
false
- .. а так сравнит как числа
В примере в вопросе как раз обе части – строки, т.к. в кавычках.
"a" имеет код 97
"1" имеет код 49
"a" больше.
Получить код символа можно методом строки
codePointAt():
"1a".codePointAt(0) // 49 - ascii и Unicode код символа "1"
"1a".codePointAt(1) // 97 - ascii и Unicode код символа латинской маленькой "a"
А вот с
NaN
вообще беспорядок:
123 < "Z" // false
123 > "Z" // тоже false