Autor | Zpráva | ||
---|---|---|---|
regy Profil |
Zdravím,
narazil jsem na jeden problém. Pomocí indexOf jsem hledal prvek v poli, ale internet explorer mi napsal, že tuto funcki nepodporuje. Nevíte někdo o ekvivalentní funcki pro IE, popř. jak to vyřešit? Děkuji |
||
Nox Profil |
#2 · Zasláno: 3. 1. 2009, 11:48:18
To mi přijde zvláštní, podle mě by to měl podporovat, předpokládám že nemluvíš o nějaké velmi staré verzi
Kdyžtak sem napiš kód, třeba je tam nějaký překlep nebo něco |
||
Chamurappi Profil |
#3 · Zasláno: 3. 1. 2009, 12:12:46 · Upravil/a: Chamurappi
Reaguji na Noxe:
Mluví o poli, nikoliv o řetězci. Žádná verze Exploreru zatím nepodporuje indexOf na poli. Ani starší verze ostatních prohlížečů jej nepodporují. Reaguji na regyho: Jelikož je JavaScript božský jazyk, lze v něm potřebnou metodu snadno dopsat. Viděl bych to nějak takto: if(![].indexOf) Array.prototype.indexOf = function(prvek) { for(var i = 0; i < this.length; i++) if(this[i] === prvek) return i; return -1; }; Edit: Přidal jsem do podmínky jedno rovnítko, aby byla funkce kompatibilní s implementací v Mozille — jak doporučuje níže ah01. |
||
ah01 Profil |
#4 · Zasláno: 3. 1. 2009, 12:18:53
regy
Metoda indexOf je až od JS 1.6 - viz https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Global_Objects/Array/indexOf. V sekci Compatibility je její implementace - stačí tento kód použít. if (!Array.prototype.indexOf) { Array.prototype.indexOf = function(elt /*, from*/) { var len = this.length; var from = Number(arguments[1]) || 0; from = (from < 0) ? Math.ceil(from) : Math.floor(from); if (from < 0) from += len; for (; from < len; from++) { if (from in this && this[from] === elt) return from; } return -1; }; } |
||
regy Profil |
#5 · Zasláno: 3. 1. 2009, 14:01:40
Děkuji. Funkce od Chamurappiho funguje bezproblémů. Další jsem nezkoušel, ale i za ně díky.
|
||
regy Profil |
#6 · Zasláno: 3. 1. 2009, 14:26:23
Jetě bychse chtěl zeptat, zda v javascriptu existuje něco podobného, jako je isset a empty v php. Nikde jsem nenašel, jak v JScriptu zjištit, zda proměnná existuje.
Děkuji |
||
Měsíček Profil |
#7 · Zasláno: 3. 1. 2009, 14:30:42
Reaguji na regyho:
"Nikde jsem nenašel, jak v JScriptu zjištit, zda proměnná existuje. " Pozor JScript != Javascript. JScript je odnož Javascriptu, ale od Microsoftu. |
||
regy Profil |
#8 · Zasláno: 3. 1. 2009, 14:39:06 · Upravil/a: regy
Omlouvám se. Mám na javascript knížku a tam je to tak nešikovně napsaný, že jsem to pochopil tak, že se tak nazývá i JavaScript...
|
||
Chamurappi Profil |
#9 · Zasláno: 3. 1. 2009, 14:44:01 · Upravil/a: Chamurappi
Reaguji na regyho:
if(typeof proměnná == "undefined") … Reaguji na Měsíčka: „Pozor JScript != Javascript.“ Řekl bych spíš (JScript == JavaScript) && (JScript !== JavaScript). Rozlišování není vůbec důležité, jde jen o název. |
||
ah01 Profil |
#10 · Zasláno: 3. 1. 2009, 14:47:03
regy
Funkce od Chamurappiho samozřejmě funguje, jen dej pozor na to, že v některých speciálních případech ti vrátí něco jiného. Např. [0, ''].indexOf('') // ve FF vrátí 1 // v IE vrátí 0 Pokud nepotřebuješ 2. parametr from, měl bys alespoň upravit Chamurappiho řešení na řádku 5: if(this[i] === prvek) return i; Tím budeš kontrolovat i typ proměnné, tak jak to dělá i implementace ve FF. |
||
regy Profil |
#11 · Zasláno: 3. 1. 2009, 15:14:23 · Upravil/a: regy
děkuji za pohotové reakce všem zúžastněným...
|
||
Měsíček Profil |
Reaguji na regyho:
<script type="text/javascript"> /** * Definice funkce "ISSET" * * Zde kontroluje spíše jen to, jestli je deklarovaná nebo * také definovaná. */ function isset (variable) { return (typeof variable !== "undefined") ? 1 : 0; } /** * Definice funkce "EMPTY" */ function empty (variable) { var x = variable; /** * Můžeš zde kontrolovat i jiné např. x == {} (pro objekt). */ return (x == null || x == false || x == "" || x == 0 || x == []) ? 1 : 0; } /** * Kontrola funkce "EMPTY" */ var prom_1 = "Babička"; var prom_2 = null; alert("Proměnná [prom_1] "+((empty(prom_1)) ? "je prázdná" : "není prázdná")); alert("Proměnná [prom_2] "+((empty(prom_2)) ? "je prázdná" : "není prázdná")); /** * Kontrola funkce "ISSET" */ var _prom_1 = "Dědeček"; var _prom_2; alert("Proměnná [_prom_1] "+((isset(_prom_1)) ? "neexistuje" : "existuje")); alert("Proměnná [_prom_2] "+((isset(_prom_2)) ? "neexistuje" : "existuje")); </script> Reaguji na Chamurappiho: "Rozlišování není vůbec důležité, jde jen o název." Takovéto závěry se mi moc nelíbí, dříve jako nováčka mne to zbytečně pletlo právě kvůli takovým, kteří si tyto jazyky nazývali jak chtěli. |
||
Timy Profil |
Měsíček
„return (typeof variable !== "undefined") ? 1 : 0;“ Nestačí vrátit pouze …? return (typeof variable !== "undefined"); |
||
Měsíček Profil |
#14 · Zasláno: 3. 1. 2009, 17:23:04
Reaguji na Timyho:
"Nestačí vrátit pouze …? " Samozřejmě stačí, něják jsem si na to zbytečně navykl. Díky |
||
Timy Profil |
#15 · Zasláno: 3. 1. 2009, 17:27:48
Měsíček
OK. |
||
ah01 Profil |
Opět si dovolím korekci. Konkrétně Měsíčekovo implementace isset a empty. Pokud se odvoláváme na PHP tak by se měly tyto fce. chovat tak jako v PHP.
isset vrací boolean hodnotu, takže žádné 1 nebo 0. Správně by to mělo vypadat, tak jak píše Timy function isset(variable){ return typeof variable !== "undefined"; } Pokud se podíváme do manuálu na empty zjistíme, které hodnoty jsou považované za prázdné. Shodou okolností jsou to ty samé, které JS považuje za false hodnoty. Navíc tam je ještě prázdné pole a řetězec "0". function empty(variable){ return ! variable || // je 0, "", null, NaN, false nebo undefined variable === "0" || // nebo je "0" (is_array(variable) && variable.length == 0); // nebo je prázdné pole } Nejsložitější je detekce prázdného pole. Kontrolovat variable == [] je nesmysl, stejně tak variable =={} pro objekt, protože JS pracuje s referencemi, tedy i [] == [] vrátí false. Detekce pole je trochu komplikovanější: // detekce pole z knihy JavaScript: The Good Parts. function is_array(value) { return value && typeof value === 'object' && typeof value.length === 'number' && typeof value.splice === 'function' && !(value.propertyIsEnumerable('length')); } Takto definované isset a empty by mělo mít totožné chování jako jejich PHP jmenovci. Test: http://jslab.net/pub/jpw/isset-empty/test.html |
||
Měsíček Profil |
#17 · Zasláno: 4. 1. 2009, 11:55:19
Co se týče toho is_array nestačilo by
var is_array = function is_array (arr) { return (arr.constructor == Array); } |
||
ah01 Profil |
#18 · Zasláno: 4. 1. 2009, 13:57:15
Měsíček
To by nepoznalo pole z jiného rámu. Např. pokud bys měl ve stránce iframe a bral nějaké proměnné z něj. |
||
Měsíček Profil |
#19 · Zasláno: 4. 1. 2009, 14:15:36
A ták, díky :)
|
||
regy Profil |
#20 · Zasláno: 5. 1. 2009, 16:36:17
Nějak se to tu rozjelo :-)
|
||
_es Profil |
#21 · Zasláno: 5. 1. 2009, 16:37:02
Chamurappi
„Reaguji na regyho: if(typeof proměnná == "undefined") … “ Nie je jednoduchšie, kratšie a rýchlejšie if(proměnná === undefined) …? |
||
Chamurappi Profil |
#22 · Zasláno: 5. 1. 2009, 17:07:36
Reaguji na Měsíčka:
„jako nováčka mne to zbytečně pletlo právě kvůli takovým, kteří si tyto jazyky nazývali jak chtěli“ Jaké tyto jazyky? Je to jeden jazyk, akorát se pro něj používá vícero jmen. Začátečníka spíš splete, když mu budeš do hlavy zbytečně hustit marketingová/právní rozhodnutí Netscapu/Microsoftu. Reaguji na _es: To vyhodí při neexistující proměnné výjimku, ne? |
||
_es Profil |
#23 · Zasláno: 5. 1. 2009, 17:31:47
Chamurappi
„To vyhodí při neexistující proměnné výjimku, ne?“ Aha, len som nerozumel, čo je myslené pod neexistujúcou premennou. Ale zase (typeof x == "undefined") je true aj vtedy ak x existuje, no jeho hodnota je undefined. Napríklad: var x; // (typeof x == "undefined") je true |
||
_es Profil |
#24 · Zasláno: 5. 1. 2009, 18:40:33 · Upravil/a: _es
Ak má byť po definícii var x; alebo po príkaze x=undefined; považované x za existujúce, dalo by sa to vyriešiť takto:
try{x;/*príkazy, ak x existuje*/}catch(e){/*príkazy, ak x neexistuje*/} |
||
_es Profil |
#25 · Zasláno: 5. 1. 2009, 23:10:59 · Upravil/a: _es
Tie pokusy o o implementáciu isset Měsíčekem a ah01 nemôžu fungovať pre neexistujúcu premennú.
Výnimka bude vyhodená už pri volaní tejto funkcie. if(x === undefined) vyhodí výnimku pri neexistujúcej premennej. No pre neexistujúce vlastnosti objektov to funguje. Teda (x.v === undefined) je true pre neexistujúcu vlastnosť v existujúceho x. No zase to má rovnakú "chybu", že to je true aj pre existujúce vlastnosti s hodnotou undefined. |
||
ah01 Profil |
Tolik lidí to četlo a nikdo si nevšiml, že jsme fci. isset nadefinovali přesně obráceně. Tedy pokud je proměnná definovaná (jet „set“) vrátí false. Správně má být pochopitelně
function isset(variable){ return typeof variable !== "undefined"; } Můžeme poprosit nějakého moderátora o opravu, myslím že Mesíček se mnou bude souhlasit. Moderátor Chamurappi: Staniž se.
_es „Ale zase (typeof x == "undefined") je true aj vtedy ak x existuje, no jeho hodnota je undefined. “ isset se v PHP chová tak, že vrátí false i na nedefinovanou proměnnou, toto se chová stejně. Je otázkou, jestli má smysl rozlišovat mezi neexistující a nedefinovanou proměnnou. Myslím, že pokud se někdo do takové situace dostane, měl by se vážně zamyslet nad svým kódem a rozmyslet si jestli by se to nedalo řešit nějak elegantněji. Hlavně používat výjimky k tomuto účelu, mi přijde jako velmi nepěkná věc. Výjimky slouží k ošetření chyb, které vzniknou za běhu a ne k řešení problémů, které můžu jako programátor ošetřit již během psaní kódu (přeci musím vědět, jestli jsem někde o pár řádku naspal var x nebo ne!) „Tie pokusy o o implementáciu isset Měsíčekem a ah01 nemôžu fungovať pre neexistujúcu premennú. “ Ano, přesně tak. V JS nejde pracovat s identifikátorem neexistující proměnné (takové, kterou jsem nikdy nepoužil a nedefinoval) tak jako v PHP (ani tam to ale není beztrestné – vyvolá to notice). V PHP můžu naspat isset($promenna_kterou_jsem_nikdy_nepouzil); // -> vrátí false a žádnou chybu to nevyvolá. Je to také proto, že isset a empty jsou navíc přímo součást jazyka a nejsou to funkce. Prostě nejde isset a empty implementovat na puntík stejně v JS jako v PHP zkrátka už proto, že to jsou rozdílné jazyky. |
||
_es Profil |
#27 · Zasláno: 6. 1. 2009, 01:39:29
ah01
„Správně má být pochopitelně function isset(variable){return typeof variable !== "undefined";} “ Ale prečo potom už nepoužiť: function isset(variable){return variable !== undefined;} Pre neexistujúcu premennú vyhodí výnimku rovnako a pre existujúcu vracia tiež to isté ako predchádzajúca funkcia. |
||
_es Profil |
#28 · Zasláno: 6. 1. 2009, 01:57:36
ah01
„Hlavně používat výjimky k tomuto účelu, mi přijde jako velmi nepěkná věc. Výjimky slouží k ošetření chyb, které vzniknou za běhu a ne k řešení problémů, které můžu jako programátor ošetřit již během psaní kódu“ No ak treba program zrýchliť, môže sa hodiť aj využitie výnimiek (alebo chýb). Napríklad som v jednom, dosť pomalom, programovacom jazyku využil zachytávanie chýb k ukončeniu cyklu a bolo to rýchlejšie ako neustále overovanie, či nie je prekročený index poľa. |
||
ah01 Profil |
#29 · Zasláno: 6. 1. 2009, 09:53:20
_es
„Ale prečo potom už nepoužiť“ ano, to by šlo použít. Ale je lepší ta varianta s typeof, protože nějaký šprýmař by mohl naspat undefined = "ha ha ha"; A pak bys nic nepoznal. |
||
_es Profil |
#30 · Zasláno: 6. 1. 2009, 10:49:00
ah01
„... protože nějaký šprýmař by mohl naspat undefined = "ha ha ha"; “ Napísať by mohol oveľa horšie veci, no tipol by som si, že porovnanie objektov na identitu bude rýchlejšie ako porovnanie mnohoznakových reťazcov, pričom jeden z nich treba najprv vygenerovať. Tvoja argumentácia je dosť zvláštna, píšeš že: „přeci musím vědět, jestli jsem někde o pár řádku naspal var x nebo ne!“ no tak isto sa dá predsa argumentovať aj o prepísaní vlastnosti undefined. Keď už, tak namiesto undefined sa dá použiť aj napríklad void 0 . |
||
Časová prodleva: 15 let
|
0