Сравнение «буквенных» и «числовых» строк. Как происходит?
В вашем случае 123 не число а строка, при сравнении строк запускается цикл который переводит символ строки в юникод если не ошибаюсь, и сравнивается номер этих юникод символов
P.S
Про сравнение лексики https://ru.wikipedia.org/wiki/%D0%9B%D0%B5%D0%BA%D...

Результат NaN считается за 0? Начальным значением NaN является Not-A-Number (не-число) — то же самое значение, что и у Number.NaN. Грубо говоря если в JS чего-то нет, то это == 0