Tach!
Inzwischen weiß ich, dass die
for ... in
-Schleife über die Propertiesitem
undlength
stolpert, je nachdem, in welcher Reihenfolge die sie Collection-Members vorfindet.
for..in-Schleifen arbeiten schon immer so, dass sie über die aufzählbaren (enumerable) Eigenschaften eines Objekts iterieren. Das wussten auch bereits ältere SELFHTML-Ausgaben. Das will man nicht, wenn man eigentlich die iterierbaren Elemente eines Arrays oder Objekts haben möchte.
Was ist überhaupt
ìtem
?
Fragen, die das MDN beantworten kann ...
Ich habe das "repariert", indem ich die Ausgabe in eine Bedingung
if (e != 'item' && e != 'length')
eingepackt habe, was ja aber kaum DIE Lösung sein kann.
NodeLists (der Rückgabewert von querySelectorAll()) haben auch noch mehr als die beiden genannten Eigenschaften und könnten zudem beliebig erweitert werden. Das Ausklammern ist keine Lösung. Die Lösung weiß aber auch das MDN, wenn man sich die Seite zu NodeList anschaut. for...of-Schleifen lösen das Problem, das man mit for...in hat, weil sie nur das berücksichtigen, was der Iterator als iterierbar zurückgibt. Das Problem ließe sich auch teilweise lösen, indem man mit hasOwnPropery() die geerbten Eigenschaften ausschließt. Moderne Browser machen das aber mit for...of eleganter.
Mache ich das Iterieren klassisch mit
for (var i = 0; i < selections.length; i++)
durchführe, ist dieser Fehler noch nie aufgetreten.
Ja, weil man damit das Iterieren auf bestimmte Eigenschaften einschränkt.
Ist das obligatorisch, dass
length
unditem
immer am Ende der Indexaufzählung stehen, also zuerst die Number-Indexe kommen? Die sind ja auch vom Typ String...
Sicherlich nicht, ist aber auch nicht relevant aufgrund anderer geeigneter Iteriervarianten.
dedlfix.