2) почему мы пишем if (chr < '0' || chr > '9'), а не if (chr < 0 || chr > 9) и в чем суть
Численное преобразование происходит в математических функциях и выражениях, а также при сравнении данных различных типов (кроме сравнений ===, !==)
https://learn.javascript.ru/types-conversion
https://habr.com/company/ruvds/blog/347866/
так что вы правы. Просто в данном случае if (chr < '0' || chr > '9') отработает корректно. Имхо, лучше всё-таки учитывать преобразование различных типов при сравнении.
3) для чего данная строка и зачем условие e = e || event;
e = e || event;
~
e = e || window.event;
если event не был явно определён выше. Т.е. допустим так
var event = new Event('keypress');
document.getElementsByTagName('input')[0].onkeypress = function(e) {
e = e || event;
...
event == window.event; e!=event;
и код будет работать не совсем корректно.
через window.event также можно получить объект события. (
javascript.ru/tutorial/events/properties здесь такой же код используется)
Имхо, опять же, присваивание e = e || event; не нужно и корректно работает только в текущей ситуации. Функция обработчик даже в чистом js всегда с event во входных параметрах. Даже если в функции явно не задана переменная для входящего объекта события, его можно получить через arguments.