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
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
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;
  };
Pak už poběží všude.

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
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
Děkuji. Funkce od Chamurappiho funguje bezproblémů. Další jsem nezkoušel, ale i za ně díky.
regy
Profil
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
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
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
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
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
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
Reaguji na Timyho:

"Nestačí vrátit pouze …? "

Samozřejmě stačí, něják jsem si na to zbytečně navykl. Díky
Timy
Profil
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
Co se týče toho is_array nestačilo by
var is_array = function is_array (arr) {
  return (arr.constructor == Array);
}
nebo by i u tohoto bylo něco co by tím prošlo a nemělo by projít?
ah01
Profil
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
A ták, díky :)
regy
Profil
Nějak se to tu rozjelo :-)
_es
Profil
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
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
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
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
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
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
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
_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
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 .

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: