Autor | Zpráva | ||
---|---|---|---|
Ofi Profil |
#1 · Zasláno: 23. 7. 2009, 12:07:00
Je nějaká obdoba isset a unset funkcí v javascriptu? na netu nic nemužu najít..
|
||
Yur4Y Profil |
#2 · Zasláno: 23. 7. 2009, 12:13:04 · Upravil/a: Yur4Y
unset:
delete premenna isset: (typeof premenna != 'undefined') |
||
Ofi Profil |
#3 · Zasláno: 23. 7. 2009, 12:46:08
díky
|
||
Chamurappi Profil |
#4 · Zasláno: 23. 7. 2009, 12:46:50
Reaguji na Ofiho:
Na co potřebuješ obdobu unset? |
||
Ofi Profil |
#5 · Zasláno: 23. 7. 2009, 12:55:36
To by bylo složité to vysvětlovat, důležité je že to jde :)
|
||
_es Profil |
#6 · Zasláno: 23. 7. 2009, 19:19:27
Ofi
„důležité je že to jde :)“ Ale toto nejde: var x = "premenná x"; delete x; alert(x); // Vyskočí hláška "premenná x" |
||
Ofi Profil |
#7 · Zasláno: 24. 7. 2009, 11:43:08
eh? ale mě to fachá..
|
||
Joker Profil |
#8 · Zasláno: 24. 7. 2009, 12:04:40
Ofi:
„eh? ale mě to fachá..“ Ono záleží i na tom, co se tím operátorem vymazává. Například pro prvky pole to funguje: var pole = new Array("první", "druhý", "třetí"); // pole je Array(0: "první", 1: "druhý", 2: "třetí") delete pole[0]; // pole je teď Array(1: "druhý", 2: "třetí"); ...ale na proměnnou to teda nefunguje, jak píše _es. Nejsem právě expert přes JS, ale řekl bych, že nepoužívané proměnné z paměti odstraní garbage collector, takže programátor nemůže určit čas, kdy přestanou fyzicky existovat... a operátor delete jen označí proměnnou jako nepoužívanou a garbage collector ji pak někdy fyzicky odstraní z paměti. |
||
sysel Profil |
#9 · Zasláno: 24. 7. 2009, 13:06:37
Hm, to je hezké použití. Něco takového jsem hledal, když jsem vyráběl 'živou' tabulku pro SuDoKu. Vyškrtávání z pole se fakt docela hodí.
|
||
Chamurappi Profil |
#10 · Zasláno: 24. 7. 2009, 13:51:14
Reaguji na Jokera:
„pole je teď Array(1: "druhý", 2: "třetí");“ Řekl bych, že je spíš Array(0: undefined, 1: "druhý", 2: "třetí"). Kdybys smazal pole[2], bylo by místo "třetí" také undefined, ale délka uvnitř pole.length by se nezměnila. Výsledek tedy vypadá stejně, jako kdybys přiřazoval undefined. |
||
Joker Profil |
#11 · Zasláno: 24. 7. 2009, 13:58:49
Chamurappi:
To záleží na tom, co si představuješ pod tím, že tam ten prvek není. Když udělám: var arr = new Array(); arr[5] = "něco"; alert(arr.length); délka toho pole bude taky 6, přestože těch pět dalších prvků jsem tam nikdy nevložil. A naopak: var pole = new Array("první", "druhý", "třetí"); // pole je Array(0: "první", 1: "druhý", 2: "třetí") delete pole[0]; for(i in pole) alert(pole[i]); ...bude mít za výsledek jen dva alerty ("druhý" a "třetí", nikoliv "undefined", "druhý", "třetí") |
||
Leo Profil |
#12 · Zasláno: 24. 7. 2009, 14:30:15
Joker
Pouziti for in je trosku demagogie ne? :-) Urcite vite, ze jine zpusoby vypisu pole vam ten "smazany" prvek pole ukazou. Nicmene co se tyka odstraneni prvku z pole: var test = ["a","b","c","d"]; test.splice(2,1); // odstrani prvek s indexem 2 a precisluje indexy Leo |
||
Chamurappi Profil |
#13 · Zasláno: 24. 7. 2009, 14:45:16
Reaguji na Jokera:
„...bude mít za výsledek jen dva alerty“ Smyčka for-in se na pole nepoužívá, není na to stavěná. Pokud si vylepším Array.prototype (doplním třeba nějaké metody), můžeš mít alertů 10 a neznamená to, že je v poli 10 prvků. „délka toho pole bude taky 6, přestože těch pět dalších prvků jsem tam nikdy nevložil“ Nevložil, ale jsou tam. Zavoláš-li a.join("-"), dostaneš "-----něco". Pokud pak zavoláš „delete arr[5]“, délka pole se nezmění. |
||
Časová prodleva: 3 dny
|
|||
_es Profil |
#14 · Zasláno: 27. 7. 2009, 08:34:36
Chamurappi
To s tým počtom prvkov, dĺžkou poľa a pod. asi nebude až také jednoduché: var x = new Array; x[4000000000] = "X"; Aj x.join("-") vytvorí veľmi dlhý reťazec s X na konci. Pritom x[0] bude undefined no aj x[4000000001], x[4000000002], ... budú undefined. |
||
Leo Profil |
#15 · Zasláno: 27. 7. 2009, 09:12:15
"Znamená to, že pole x má 4 000 000 001 prvkov?"
Vlastnost length pole bude opravdu 4 000 000 001. Jestli bude mit 4 000 000 001 prvku je jen filozoficka otazka, protoze prvek s indexem 5 bude undefined stejne jako prvek s indexem 5 000 000 000. V nekterych verzich prohlizecu to nicmene prestava byt filozoficka otazka pokud chcete aplikovat metodu reverse, chybne pak prirazuje pamet i tem mezilehlym prvkum ktere jsou undefined a zvaharuje na nedostatku pameti. Leo |
||
_es Profil |
#16 · Zasláno: 27. 7. 2009, 09:26:26
Leo
„prvek s indexem 5 bude undefined stejne jako prvek s indexem 5 000 000 000“ Maximálna hodnota indexu je 4 294 967 295. |
||
Leo Profil |
#17 · Zasláno: 27. 7. 2009, 10:00:13
"Maximálna hodnota indexu je 4 294 967 295."
O max. hodnotu indexu tady nejde, proste si misto tech 5 000 000 000 dosadte treba 4 000 000 100. Leo |
||
Joker Profil |
#18 · Zasláno: 27. 7. 2009, 10:10:57
<mimo-téma>
_es: > „prvek s indexem 5 bude undefined stejne jako prvek s indexem 5 000 000 000“ > Maximálna hodnota indexu je 4 294 967 295. Ovšem je to tak, jak psal Leo- v tomhle případě prvek s indexem 5 000 000 000 bude skutečně undefined, stejně jako prvek s indexem 5 (minimálně v Opeře). </mimo-téma> |
||
_es Profil |
#19 · Zasláno: 27. 7. 2009, 10:24:58 · Upravil/a: _es
Joker
„v tomhle případě prvek s indexem 5 000 000 000 bude skutečně undefined, stejně jako prvek s indexem 5 (minimálně v Opeře). “ Treba skúsiť tento kód: var x = new Array; x[5000000000] = "X"; alert(x.length); Odhadujem, že (skoro) všade, aj v Opere, vyskočí hláška "0". x[5000000000] vlastne zodpovedá x["5000000000"]. Teda v druhom riadku bola vytvorená vlastnosť objektu - poľa x s názvom 5000000000. x[5000000000] aj x["5000000000"] bude "X". x[5000000001] bude undefined, lebo vlastnosť objektu x s názvom 5000000001 neexistuje. Maximálna hodnota indexu poľa je naozaj len 4 294 967 295. |
||
Leo Profil |
#20 · Zasláno: 27. 7. 2009, 18:45:50
"Maximálna hodnota indexu poľa je naozaj len 4 294 967 295."
V kazdem jazyku je nejake omezeni co do rozsahu a velikosti, ale nic to nemeni na tom, ze neprirazeny prvek pole je undefined stejne jako ten zlikvidovany pomoci delete. A vubec co tady resime, kdyz se puvodni tazatel uz neozyva a ani nenapsal proc a k cemu likvidaci promenne potrebuje ani co si pod tou likvidaci predstavuje... Leo |
||
Chamurappi Profil |
#21 · Zasláno: 27. 7. 2009, 18:57:04 · Upravil/a: Chamurappi
Reaguji na _es:
> var x = "premenná x"; > delete x; > alert(x); // Vyskočí hláška "premenná x" Zajímavé je, že pokud se nepoužije var, proměnná se opravdu smaže. Doposud jsem si myslel, že mezi globálně deklarovanou proměnnou a členem na globálním objektu není rozdíl. Asi to tak nebude. Připadá mi to zbytečně zmatené. |
||
_es Profil |
#22 · Zasláno: 27. 7. 2009, 19:02:12
Leo
„A vubec co tady resime, kdyz se puvodni tazatel uz neozyva“ Príspevky môžu byť užitočné aj pre iných a zavádzajúcu informáciu, menej sa týkajúcu témy, je lepšie vysvetliť, než ponechať tak. |
||
_es Profil |
#23 · Zasláno: 27. 7. 2009, 19:19:27 · Upravil/a: _es
Chamurappi
Pamätám si to z prvých kapitol nejakej učebnice JavaScriptu. Bude to asi z dôvodu optimalizácie skriptov. Použitie s var bude asi predspracované v prvej fáze analýzy skriptu spolu s definíciami funkcií. Co přináší nový ECMAScript 5? (dokončení), Striktní režim. Použitie bez var by v tom "striktnom režime" malo byť zakázané. No asi by aj tak malo stále fungovať window.x = hodnota_x; |
||
Leo Profil |
#24 · Zasláno: 27. 7. 2009, 20:58:54
Pouziti var u (globalnich) promennych se da jenom doporucit, jinak vam muze IE pripravit horke chvile. Leo
|
||
_es Profil |
#25 · Zasláno: 28. 7. 2009, 06:23:39 · Upravil/a: _es
Ešte k tomu môjmu predchádzajúcemu príspevku:
alert(x); pri neexistujúcej premennej vyvolá chybu. No: var x; alert(x); alert(x); var x; Takisto nejdú zmazať bežným spôsobom definované funkcie, no zato idú prepísať na inú funkciu, alebo aj na niečo, čo ani nie je funkciou. |
||
_es Profil |
#26 · Zasláno: 28. 7. 2009, 07:08:06
Yur4Y
„unset: delete premenna “ Spoľahlivejšie ako: delete premenna; delete premenna || premenna = void 0; |
||
Časová prodleva: 3 roky
|
|||
Mario92 Profil |
#27 · Zasláno: 25. 8. 2012, 17:01:59
Dá se toto zminene (typeof premenna != 'undefined') pouzit i na prvky formulare konkretne mam na mylsi radio
v php bych to zapsal takto if(isset($_POST["prvek"])) ale ja t o potrebuju v JavaScriptu slo by to takto if(typeof "id_prvek" != 'undefined') ??? |
||
panther Profil |
#28 · Zasláno: 25. 8. 2012, 21:59:11
Mario92:
„Dá se toto zminene (typeof premenna != 'undefined') pouzit i na prvky formulare konkretne mam na mylsi radio“ důvod, proč to nezkusíš, je jaký? Nezabralo by ti to tolik času jako položení dotazu zde na diskusi. |
||
Časová prodleva: 11 let
|
0