На самом деле вся суть при работе с обычным объектом в length.
Например это:
var obj = {
0 : 'zero',
1 : 'one',
length : 2,
foo : 'bar'
};
[].push.call(obj, 'pushed');
alert( JSON.stringify(obj) );
будет работать. Но не везде.
А localStorage это отдельная вещь, хотя в фф например тоже проблем нет:
alert(localStorage.length);
[].push.call(localStorage, 'pushed');
alert(localStorage.length);
Другое дело что length в localStorage считает все добавленные элементы, а значит если там есть пары ключ - значение, то push будет происходить некрасиво, т.к. опирается на length.