Autor Zpráva
Kcko
Profil
Někde tu byl topic či zmínka o tom, že je nevhodné na určité účely tento cyklus používat. Nemohu ho najít.

Kolega v práci použil něco jako (pseudokód):
var string = "nějaká shluk znaků".split(" "); a prochází to cyklem for in. Přišlo mi vhodnější použít klasický cyklus for

Může mi někdo říct zda ano či ne a odkázat mě na problém s for in?
DJ Miky
Profil
Pokud si k polím přidáš nějakou metodu, třeba sum():
Array.prototype.sum = function() {
    var sum = 0;
    for(var i = 0; i < this.length; ++i) {
        sum += this[i];
    }
    return sum;
}

var ar = [1, 2];

for(var i in ar) {
    alert(i + ': ' + ar[i]);
}

Alert vypíše:
0: 1
1: 2
sum: function( ) {}

Dá se to vyřešit podmínkou na hasOwnProperty:
for(var i in ar) {
    if(ar.hasOwnProperty(i)) {
        alert(i + ': ' + ar[i]);
    }
}
Kcko
Profil
DJ Miky:
Aha, takže jsem se sekl s tím, že to dělá špatně a měl by si dávat pozor pouze u prototypování. Díky!
DJ Miky
Profil
Podle mě není for–in špatné řešení, ale měla by se zároveň použít výše zmíněná kontrola hasOwnProperty (což už je možná trochu méně přehledné, než klasický for). Jinak může v budoucnu někdo přijít, přidat si do prototypu vlastní metodu a nevědomky tak způsobit (trochu záludné) regresní chyby.
_es
Profil
DJ Miky:
Podle mě není for–in špatné řešení, ale měla by se zároveň použít výše zmíněná kontrola hasOwnProperty
Čo však nie je u poľa vhodné, ak sa doň uloží nejaká vlastnosť ako do objektu - pre pole x nastaví x.vlastnosť=hodnota.
DJ Miky
Profil
Ano, ale jednak to není případ zmíněný v prvním příspěvku a jednak míchat „asociativní“ přístup s číselnými indexy je prasárna, aniž bych takové pole potřeboval procházet sekvenčně.
Kcko
Profil
Doplněk: roli může hrát i rychlost a v kolegově případě je to o dost pomalejší, viz. https://blogs.oracle.com/greimer/resource/loop-test.html
_es
Profil
DJ Miky:
jednak to není případ zmíněný v prvním příspěvku
Je, lebo metóda split vracia pole.

míchat ‚asociativní‘ přístup s číselnými indexy je prasárna
Ale to snáď predsa v prvom príspevku nastáva - na „číselné indexy“ poľa je aplikovaný „asociatívny prístup“. Je vôbec podľa špecifikácie zaručené, že pri cykle for in pôjdu indexy vzostupne?

Kcko:
Ten test asi nie je korektný, lebo s hodnotami poľa nič nerobí - rôzne optimalizačné techniky to potom môžu výrazne zmeniť.
Chamurappi
Profil
Reaguji na _es:
Je vôbec podľa špecifikácie zaručené, že pri cykle for in pôjdu indexy vzostupne?
Není. Tuším, že tam je explicitně řečené, že pořadí může být všelijaké. V praxi v prohlížečích také všelijaké je.


Reaguji na DJ Mikyho:
míchat ‚asociativní‘ přístup s číselnými indexy je prasárna
Také mi to připadá trochu odpudivé. Kupodivu ale dokáže takové obohacené pole vylézt přímo z hledání nativní metodou match.
DJ Miky
Profil
_es:
Měl jsem na mysli kombinaci čistě numerických indexů a textových vlastností, tedy vytváření pole/objektu typu:
x[0] = 1;
x[1] = 2;
x['test'] = 3;
To by slušný programátor používat neměl. Že to vyleze ze String.match(), jak poznamenal Chamurappi, je docela vtipné.

Nezaručené pořadí výstupu je dobrá poznámka, to trochu omezuje využití for–in.
_es
Profil
DJ Miky:
To by slušný programátor používat neměl.
Teda programátori jQuery potom nie sú „slušní“ programátori.

Vaše odpověď

Mohlo by se hodit

Neumíte-li správně určit příčinu chyby, vkládejte odkazy na živé ukázky.
Užíváte-li nějakou cizí knihovnu, ukažte odpovídajícím, kde jste ji vzali.

Užitečné odkazy:

Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: