Autor | Zpráva | ||
---|---|---|---|
Kcko Profil |
#1 · Zasláno: 4. 7. 2013, 10:36:22
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 |
#2 · Zasláno: 4. 7. 2013, 10:49:54
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 |
#3 · Zasláno: 4. 7. 2013, 11:45:48
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 |
#4 · Zasláno: 4. 7. 2013, 12:27:52
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 |
#6 · Zasláno: 4. 7. 2013, 13:04:34
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 |
#7 · Zasláno: 4. 7. 2013, 13:05:34
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
|
||
Časová prodleva: 4 dny
|
|||
_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 |
#9 · Zasláno: 8. 7. 2013, 09:56:02
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 |
#10 · Zasláno: 8. 7. 2013, 10:53:08
_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; Nezaručené pořadí výstupu je dobrá poznámka, to trochu omezuje využití for–in .
|
||
_es Profil |
#11 · Zasláno: 8. 7. 2013, 11:23:32
DJ Miky:
„To by slušný programátor používat neměl.“ Teda programátori jQuery potom nie sú „slušní“ programátori. |
||
Časová prodleva: 11 let
|
0