| 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: 13 let
|
|||
0