dedlfix: for ... in versa klassischer For-Schleife

Beitrag lesen

Tach!

Inzwischen weiß ich, dass die for ... in-Schleife über die Properties item und length 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 und item 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.