Q:

javascript выдавал NaN по непонятным причинам, почему?

js отмечал время нажатия и отпускания клавиш, после чего считал время удержания каждой и выводил на экран значения.
Очень часто выводил на экран или весь массив, или отдельные значения NaN.
Методом проб и ошибок оказалось, что мешает клавиша Tab. То бишь, если за время сессии на странице была использована Tab - выводились NaN'ы.
За другими служебными клавишами такое не замечалось.
JS:
var time_down = [];
var time_up = [];
var time_press = [];
var count_up = 0;

document.getElementById('pass').addEventListener('onkeydown', setTime_down);
document.getElementById('pass').addEventListener('onkeyup', setTime_press);
document.getElementById('sub').addEventListener('onclick', writeResult_time);

function setTime_down() {
    time_down.push(new Date().getTime());
}

function setTime_press() {
    time_up.push(new Date().getTime());
    time_press.push(time_up[count_up] - time_down[count_up]);
    count_up++;
}

function writeResult_time() {
    time_press.push(time_up[time_up.length-1] - time_down[0]);
    document.getElementsByName("passTime_value")[0].value = time_press.join();
    alert(time_press);
}

Решилась проблема строкой:
<body onkeydown="if(event.keyCode==9) return false;">

Почему так происходило?
Может быть можно было решить проблему иначе, ведь многие привыкли использовать tab при переходе от поля логина к паролю?

A:

Потому что при нажатии tab-a, событие keyup в "pass" происходило раньше, чем keydown, и count становился больше длины time_down.
Проверяйте длины массивов в setTime_press:
function setTime_press() {
  if (time_up.length < time_down.length) {
    time_up.push(new Date().getTime());
    time_press.push(time_up[count_up] - time_down[count_up]);
    count_up++;
  }
}

