Aren't they just objects that have integer properties; that's why you can
for (k in ['a', 'b']) {
console.log(k);
}
and get back 0, 1? However:
var a = {0:'a', 1:'b'};
for (k in a) {
console.log(k);
}
also outputs 0, 1.
Edit: turns out, you can even have doubles, too:
var weird = {3.14:'hello', 6.28:'world'};
// for loop above emits: 3.14, 6.28
console.log(weird[3.14]); // emits 'hello'