Pour les jeux en général il vaut mieux faire un code qui sauvegarde l'état des touches (cherches "key poll" sur google).
Pour aller en diagonale le plus simple est d'utiliser des vecteurs.
Exemple :
var position = new Vector2(); // position du perso
var speed = 10; // vitesse du perso
var keyboard = new KeyPoll();
...
var direction = new Vector2(0,0);
direction.x = keyboard.isDown(Keys.RIGHT) - keyboard.isDown(Keys.LEFT);
direction.y = keyboard.isDown(Keys.UP) - keyboard.isDown(Keys.DOWN);
// on normalize la direction pour que la magnitude du vecteur soit de 1 (autrement le perso ira plus vite en diagonale ! )
direction.normalize();
// velocité = direction * vitesse
var velocity = direction.clone();
velocity.scale(speed);
// nouvelle position = position actuelle + velocité
var newPosition = position.clone();
newPosition.add(velocity);
Enfin pour ton problème ca doit venir à une mauvaise gestion des énervements du clavier. Avec un key polling correctement implémenté le problème se posera pas.
NB : les classes Vector2, KeyPoll, et Keys ne sont évidement pas standards. Mais encore une fois tu devrais pas avoir trop de mal à trouver des implémentations en js...
PS : Tu peux aussi te baser sur le temps écoulé pour déterminer la vitesse du perso au lieu d'être dépendant du nombre de cycle/sec de ton jeu. (Cf "time-based animation" dans google).