alert( parseInt(x)+ parseInt(y) );
p.s.
U mnie w Chrome i FF pokazuje 9.
Wydaje mi się, że nie pokazałeś całego kodu.
Owszem 54 ale w takim przypadku:
var x = '5';
var y = 4;
alert(x+y);
// daje wynik 54
natomiast
var x = 5;
var y = 4;
alert(x+y);
// daje wynik 9
Chodzi o to w jaki sposób JS nadaje priorytety typom w wyrażeniach. W JS zarówno suma liczb jak i sklejanie łańcuchów realizuje operator "+" w związku z tym interpreter musi mieć zdefiniowane odgórnie zasady, który z tych typów będzie "dominujący" w operacji.