Autor Zpráva
Ofi
Profil
Je nějaká obdoba isset a unset funkcí v javascriptu? na netu nic nemužu najít..
Yur4Y
Profil
unset:
delete premenna

isset:
(typeof premenna != 'undefined')
Ofi
Profil
díky
Chamurappi
Profil
Reaguji na Ofiho:
Na co potřebuješ obdobu unset?
Ofi
Profil
To by bylo složité to vysvětlovat, důležité je že to jde :)
_es
Profil
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
eh? ale mě to fachá..
Joker
Profil
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
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
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
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
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
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í.
_es
Profil
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";
Znamená to, že pole x má 4 000 000 001 prvkov?
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
"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
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
"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
<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
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
"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
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
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
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
Pouziti var u (globalnich) promennych se da jenom doporucit, jinak vam muze IE pripravit horke chvile. Leo
_es
Profil
Ešte k tomu môjmu predchádzajúcemu príspevku:
alert(x); pri neexistujúcej premennej vyvolá chybu.
No:
var x;
alert(x);
aj:
alert(x);
var x;
spôsobí hlášku undefined.
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
Yur4Y
unset:
delete premenna

Spoľahlivejšie ako:
delete premenna;
bude teda
delete premenna || premenna = void 0;
Mario92
Profil
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
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.

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:

Odkud se sem odkazuje


Prosím používejte diakritiku a interpunkci.

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

0