Bitva o smyčky JavaScriptu (for, for...in, for...of, forEach atd.)

Iterování přes objekty a pole je něco, co musí udělat každý vývojář. Ať už jste začátečník nebo ostřílený veterán, nakonec budete muset najít něco ve větším souboru dat. Ale když něco iterujete (procházíte smyčkou), možná se trochu ztratíte se všemi dostupnými možnostmi. Zde je tedy rychlý přehled těch hlavních.

Poznámka: Toto není úvod do for pro začátečníky smyčky fungují, ale spíše srovnání for dostupné možnosti smyčky.

pro (klasika)

for je zdaleka nejběžnější smyčka. Není specifická pro pole nebo objekty (nebo vlastně pro jakoukoli datovou strukturu) a lze ji kombinovat téměř s čímkoli a vytvořit tak výkonné a rychlé smyčky, pokud je správně nakonfigurujete. Zde je klasický for smyčka v akci:

for smyčky lze použít ve spojení s break , continue nebo return vytvořit nějaké vážně všestranné funkce.

pro každého

forEach umožňuje vrátit celý záznam z pole. Je to jednoduché a přímočaré, ale neobsahuje další break , continue a return funkčnost nalezená s klasickým for smyčka. Vypadá však neuvěřitelně čistě.

Představte si forEach smyčka jako čistší, pro pole specifická for smyčka.

pro...v

for...in smyčka umožňuje procházet vyčíslitelné vlastnosti objektu, včetně těch, které nastavil nadřazený prototyp (pokud je přítomen).

Bohužel to asi není to, co chcete. U každé iterace můžete provést kontrolu, abyste zjistili, zda vlastnost patří objektu nebo jeho prototypu (hasOwnProperty zde by bylo perfektní), ale to opravdu poškozuje čitelnost. Kromě toho for...in smyčky vracejí pouze řetězce, takže pokud procházíte polem ve smyčce (což funguje, navzdory zmínce o vlastnostech výše), pravděpodobně nebudete chtít použít jednu z nich.

pro...z

for…of iteruje přes jakýkoli vyčíslitelný objekt, nebude převádět hodnoty, které najde, a přitom podporuje funkcionalitu break , continue a return .

Představte si for...of jako čistší verze for smyčky, speciálně pro iterovatelné objekty, aniž by došlo ke ztrátě některého z for funkce smyčky.

Třída Object

Jedna konzistentní nevýhoda výše uvedeného for smyček spočívá v tom, že jejich kompatibilita s objekty se liší. To vše se však změní s použitím Object třída.

Pomocí Object , můžeme převést naše objekty na pole (slibuji, že to bude brzy dávat smysl) a pak tato pole procházet všemi výše uvedenými smyčkami.

Nyní běžně uvidíte forEach používá se ve spojení s touto metodou, ale problém s tím je, že ztratíte schopnost break , continue nebo return během smyčky. Z tohoto důvodu bych doporučil zvážit klasický for smyčka ve spojení s touto metodou, ale zde je pro úplnost příklad obou (všimněte si, že tento příklad používá Object.keys() , která je popsána níže):

Object.keys()

Tato užitečná funkce vrací pole klíčů nalezených v zadaném objektu. Ještě praktičtější je, že obsahuje pouze klíče patřící k bezprostřednímu objektu a ne jeho prototypu, takže to znamená, že už nemusíte vidět nadřazené rekvizity jako u for...in .

Object.entries()

Tento vrátí každý záznam v jeho celistvosti, včetně vlastnosti i hodnoty. To může být užitečnější, pokud si chcete ponechat klíč, jehož hodnotu vidíte (což často děláte).

Object.values()

Jak název napovídá, tato metoda vrací pouze hodnoty nalezené v objektu. Žádný index, žádný klíč, pouze hodnoty.

Balení věcí

Možná jste dosáhli tohoto bodu a doufali jste, že řeknu:„Tak se děti ujistěte, že vždy používáte to nejlepší smyčka, <insert loop here> “.

Ale no tak, takhle programování funguje jen zřídka.

Ve skutečnosti správný přístup pro vás zcela závisí na kontextu. Některé z výše uvedených metod jsou rychlejší než jiné, některé jsou užitečnější, jiné čitelnější. Je na vás, abyste našli správnou kombinaci výše uvedeného, ​​ale doufejme, že vám to pomohlo na vaší cestě k tomuto rozhodnutí.