Autor | Zpráva | ||
---|---|---|---|
Misha Profil * |
#1 · Zasláno: 7. 9. 2014, 19:29:39
U funkce Reverse jsem se setkal s něčím, u čehož si nejsem jist, že by to tak mělo opravdu fungovat. A tak bych potřeboval trochu poradit a poučit.
<script type="text/javascript"> function navig() { var poziceElementuR = new Array(); // vytvoření lokální proměnné poziceElementuR = poziceElementu; // zkopírování obsahu proměnné poziceElementuR = poziceElementuR.reverse(); // otočení obsahu proměnné document.write(poziceElementuR.join()); // vypíše obrácený obsah pole document.write(poziceElementu.join()); // také vypíše obrácený obsah pole // navíc pokud funkci provedu 2x, tak se pořadí střídá (jako by proměnná poziceElementuR byla globální) } poziceElementu = new Array(); // vytvoření globální proměnné poziceElementu[0] = 251; poziceElementu.push(9); poziceElementu.push(65487); navig(); </script> Umíte mi to někdo vysvětlit? Nebo kde dělám chybu, když chci aby v proměnné poziceElementuR bylo pořadí obrácené, ale v poziceElementu nebylo? |
||
Davex Profil |
#2 · Zasláno: 7. 9. 2014, 20:12:28
Není to způsobeno metodou
reverse() , ale tím, že nová proměnná je pouze referencí na původní pole. Pro zkopírování pole můžeš použít kód
poziceElementuR = poziceElementu.slice(); |
||
Joker Profil |
#3 · Zasláno: 7. 9. 2014, 20:14:05
Misha:
„Umíte mi to někdo vysvětlit?“ Ano. „Problém“ není v metodě reverse , ale v operátoru = .
Totiž přiřazení objektu někam nevytvoří kopii, ale referenci. Tzn. poziceElementuR = poziceElementu; nevytvoří kopii objektu poziceElementu, ale z poziceElementR udělá referenci na poziceElementu, takže ve skutečnosti existuje pořád jen jeden objekt, nad kterým se ty operace dělají.
Je třeba vytvořit kopii pole, poziceElementuR = poziceElementu.slice(0);
Ještě poznamenám, že není dobrý nápad takhle používat globální proměnné, lepší by bylo, aby poziceElementu byla parametr funkce navig. |
||
Časová prodleva: 10 let
|
0