Hallo,
damit diese Debatte doch noch irgendeinen Sinn bekommt, versuchen wir mal, unser Wissen zu teilen. Ergänzungen willkommen!
Was ist der Unterschied zwischen einem Array, einer NodeList und einer HTMLCollection?
Ein Array ist ein Objekttyp aus dem JavaScript-Kern (ECMAScript). Man erzeugt sie über »new Array« oder mit der Literalschreibweise [ ... ]. Viele eingebaute JavaScript-Methoden geben Arrays zurück. Arrays sind vom Array-Konstruktor abgeleitet und haben daher die entsprechenden Methoden und Eigenschaften.
Eine NodeList ist ein Objekttyp aus dem W3C Document Object Model (Core). Es handelt sich um eine Liste von Knotenobjekte eines Dokumente, in erster Linie HTML-Elementobjekten. So eine Knotenliste erzeugt man üblicherweise nicht selbst, sondern bekommt sie von DOM-Methoden wie document.getElementsByTagName geliefert. Die Eigenschaft childNodes von Elementknoten liefert ebenfalls eine NodeList.
Diese NodeLists scheinen sich wie ein Array aufzuführen, sie sind es aber nur in einer Hinsicht: Sie haben eine Eigenschaft length und man kann die einzelnen Elemente in der Liste mit der Klammer-Schreibweise [index] ansprechen. Man kann sie also genauso wie einen Array durchlaufen:
for (var i = 0; i < nodelist.length; i++) { ... nodelist[i] ... }
Aber das ist schon alles, was sie mit Arrays gemeinsam hat. NodeList-Objekte haben nicht die anderen Methoden von Array-Objekten.
Intern wird nodelist[i] auf nodelist.item(i) umgeschrieben. Man kann also auch .item(i) schreiben, wenn man es länger will. Es ist zumindest interessant, dieses DOM- zu ECMAScript-Binding zu kennen. Denn item() verhält sich etwas anders als der Klammer-Operator [i] bei Arrays. item() liefert null zurück, wenn es kein Listenelement mit dem angegebenen Index gibt. Deshalb kann man NodeLists auch so durchlaufen:
for (var i = 0, element; element = nodelist[i]; i++) { ... element ... }
Da spart man sich die Zuweisung element = nodelist[i]; im Schleifenkörper. Denn wenn nodelist[i] null ergibt, ergibt auch die Zuweisung null und die Schleife bricht ab.
(Bei Arrays ist das prinzipiell auch möglich, aber nur wenn Arrays ausschließlich Elemente besitzen, die umgewandelt in Boolean true ergeben. Das ist bei NodeLists der Fall - sie enthalten Knoten und die sind Objekte und Objekte sind immer gleich true. Siehe dazu auch http://aktuell.de.selfhtml.org/artikel/javascript/objektabfragen/#boolean und http://aktuell.de.selfhtml.org/weblog/javascript-syntax.)
Eine HTMLCollection ist eine spezielle NodeList aus dem HTML-spezifischen DOM. Sie haben eine zusätzliche Methode, nämlich namedItem. namedItem() durchsucht die Liste nach einem Element, dessen Name oder ID mit dem Parameter übereinstimmt. HTMLCollections erzeugt man üblicherweise nicht selbst, sondern gewisse DOM-HTML-Methoden bzw. -Eigenschaften ergeben HTMLCollections. Zum Beispiel sind document.images, document.forms, die elements-Eigenschaft bei form-Elementen, die rows-Eigenschaft bei table und die cells-Eigenschaft bei tr HTMLCollections.
namedItem() wird in JavaScript auf den Punkt-Operator zum Zugriff auf Unterobjekte (Property Accessor) umgeschrieben. htmlcollection.bla bzw. htmlcollection["bla"] wird zu htmlcollection.namedItem("bla") aufgelöst. Das kommt jetzt spanisch vor, ist uns aber gut bekannt von document.forms.formularname oder document.forms.formularname.elements["feldId"]. Jetzt wissen wir, wie diese Ausdrücke intern aufgelöst werden.
Diese spezifische Eigenschaft von HTMLCollections nützt vor allem bei der Suche nach Elementen mit einem bestimmten name-Attribute (z.B. document.forms.formular.elements.feld). Bei der Suche nach einer ID könnte man hingegen auch direkt document.getElementById verwenden und der Nutzen von namedItem ist gering.
Dann gibt es eine kleine Verwirrung: Verschiedene Browser verwenden HTMLCollections dort, wo eigentlich nur NodeLists spezifiziert sind. Z.B. ergibt document.getElementsByTagName im Firefox eine HTMLCollection, was eigentlich eine NodeList sein sollte.
Es hilft auch nicht wirklich weiter, dass Firefox in dem Fall standardwidrig auch die namedItem-Methode zur Verfügung stellt. Denn wenn man nach IDs suchen will, gibt es document.getElementById, wenn man dokumentweit bei allen Elementen nach Namen suchen will, gibt es document.getElementsByName. Eine Suche nach name-Attributen bei Elementen eines bestimmten Types kommt eher selten vor.
Solche nicht standardkonformen HTMLCollections sollte man daher wie NodeLists behandeln, dann kann man sich sicher sein, dass das Script browserübergreifend funktioniert.
Weitere Postings zum Thema:
http://forum.de.selfhtml.org/archiv/2006/9/t137474/#m893051
http://forum.de.selfhtml.org/archiv/2008/6/t172511/#m1130623
Mathias