Jag såg att stattin har länkat till mitt 4 år gamla inlägg. Dock behöver det inlägget revideras lite.
Objekt och arrayer är två (delvis) olika saker i Javscript. Ett objekt är samma sak som en haslista, eller med andra ord en lista där index kan bestå av strängar. Det finns två syntaxer för att komma åt egenskaper för ett objekt: objektet.egenskapen och objektet["egenskapen"]
Båda är funktionellt ekvivalenta förutom att nr 1 är begränsat till att namnet för egenskapen är begränsat till tecken som får användas i variabelnamn, och du kan passa valfri sträng till nr 2. (Detta kan vara intressant om du behöver konstruera en sträng och använda som index.) Men på alla ställen där du kan använda nr 1 kan du använda nr 2 istället.
T ex går det utmärkt att skriva document["getElementById"]("någotID"); istället för document.getElementById("någotID");
En array däremot är ett specialfall av ett objekt. En array, som har klassen Array, är en subklass av klassen Object. Allt som gäller för Object gäller således för Array. Att, som jag skrev i mitt gamla inlägg, arrayer kan ha strängindex är alltså egentligen inget annat än en konsekvens av att objekt i allmänhet kan ha det.
Arrayer har alltså alla egenskaper som objekt har, och ett par till som t ex egenskapen length som reflekterar arrayens längd och metoden sort som kan användas för att sortera elementen i arrayen.
Vad gör då for(i in array)? Jo, den går igenom all index som objektet array har. for(i in x) opererar alltså på objekt, och även på arrayer som alltså råkar vara ett specialfall av objekt. Normalt ska en array bara innehålla de numeriskt indexerade elementen. Och om man lägger till fler element, även dessa.
Hur förklarar det att "lastIndexOf", "indexOf", "toJSON" dyker upp? Jo, dessa är metoder som man kan använda för att plocka element, samt konvertera till JSON-format, respektive. Microsoft verkar dock ha lagt till dessa element med ett fulhack som gör att de listas i for(i in x) som objekt-egenskaper. Detta är helt enkelt en bugg i IE. (Eller eventuellt ett resultat av något JS-ramverk du använder, som prototype eller jQuery. Jag har itne IE7 installerat så jag kan inte kolla hur det funkar)
Lösningen är att definiera enarray som objekt istället för som array. (Ty du använder den som ett objekt) En sak du kan tänka på är att du normalt inte behöver ange storleken när du skapar en array. I arr_keys är det onödigt, men oskadligt. I deklarationen av enarray är det direkt felaktigt. Längden 3 gör att enarray[0], enarray[1] och enarray[2] reserveras och enarray.length sätts till 3, men har ingen effekt alls på kalle, per och caroline.
Jag föreslår följande kod. Notera hur jag demonstrativt har bytt ut arr mot obj där det är relevant. Notera också hur jag använder array-metoden push för att dynamiskt lägga till element sist i arrayen.
<script type="text/javascript">
function obj_keys(arr)
{
var tmp_arr = []; // [] är ekivalent med new Array();
for (key in arr)
tmp_arr.push(key);
return tmp_arr;
}
var ettobjekt = {}; // {} är ekivalent med new Object();
ettobjekt["kalle"] = "fotboll";
ettobjekt["per"] = "bandy";
ettobjekt["caroline"] = "fotboll";
var keys = obj_keys(ettobjekt);
for (i=0; i<keys.length; i++)
{
alert(keys[i]);
}
</script>
Må detta inlägg vara i fyra år till innan det behöver revideras. ;)