Kontakty

TOPEOF prijímajúci operátor. JavaScript, TypeOF, Typy a triedy JavaScript Skontrolujte typ premennej

Dynamická identifikácia typov

Identifikácia dynamického typu (RTTI) Umožňuje určiť typ objektu počas realizácie programu. Ukazuje sa, že je užitočné z viacerých dôvodov. Najmä odkazom na základnú triedu je možné presne presne určiť typ objektu, ktorý je k dispozícii v tomto odkaze. Dynamická identifikácia typov tiež umožňuje vopred kontrolovať, ako úspešný bude výsledok typu typu prináša, ktorý zabraňuje exkluzívnej situácii v súvislosti s nesprávnym prezeraním typov. Okrem toho, dynamická identifikácia typov je hlavnou zložkou reflexie.

Na podporu dynamickej identifikácie typov v C #, sú k dispozícii tri kľúčové slová: je, as a typof. Každý z týchto kľúčových slov sa zase ďalej posudzuje.

Operátor je.

Špecifický typ objektu možno určiť pomocou operátora IS. Nižšie je jeho spoločná forma:

je expresia typu

tam, kde výraz označuje samostatný výraz, ktorý opisuje objekt, ktorého typ je skontrolovaný. Ak má výraz kompatibilný alebo rovnaký typ ako skontrolovaný typ, výsledok tejto operácie je pravdivý, inak nepravdivý. Výsledok bude teda pravdivý, ak má výraz overiteľný typ v jednej forme alebo inom. Vo vyhlásení typu je, obe sú definované ako kompatibilné, ak sú rovnaký typ alebo ak je poskytnutá referenčná transformácia, balenie alebo rozbalenie.

Nižšie je príkladom používania operátora IS:

Pomocou systému; Názov mespace ConsoleApplication11 (Class Add () Class Sum: Pridať () Triedny program (Static Void Main () (Pridať A \u003d Nový pridanie (); SUMS S \u003d Nová súčet (); IF (A IS Add) Console.writeline ("Premenná) A má typ doplnku "); ak (s súčtou) konzola.writeline (" typ premennej S je zdedený z inzerát triedy "); konzola.Readline ();)))

Operátora

Niekedy sa vyžaduje konverzia typu počas realizácie, ale nevytvárajú výnimku, ak bude výsledok tejto konverzie neúspešný, čo je celkom možné, keď sú uvedené typy. Na tento účel má operátor, ktorý má nasledujúci tvar:

ako výrazný výraz

tam, kde výraz označuje samostatný výraz, ktorý sa konvertuje na zadaný typ.

Ak sa výsledok takejto konverzie ukáže, že bude úspešný, odkaz na typ sa vráti a inak je prázdny odkaz. Ako operátor môže byť použitý len na prevod prepojení, identity, balenia, rozbalenie. V niektorých prípadoch môže prevádzkovateľ slúžiť ako vhodná alternatíva k operátorovi je. Ako príklad zvážte nasledujúci program:

Pomocou systému; Názov mespace ConsoleApplication1 (Class Add () Class Sum: Pridať () Triedny program (static Void Main (); Sum S \u003d Nová súčet (); // Vykonajte reklamu A \u003d S AD; ak (A! \u003d NULL) konzola.writeline ("Konverzia bola úspešná"); inde konzola.writeline ("Chyba konverzia"); Console.Readline ();))

Výsledkom tohto programu bude úspešná konverzia.

a \u003d (b\u003e 0) && (C + 1! \u003d D); Flag \u003d! (Stav \u003d 0);

Tabuľka 14.5. Logickí operátori

Popis operátora

! Nie (logická inverzia)

&& A (logické násobenie)

|| Alebo (logické pridávanie)

Tabuľka 14.6. Výsledky vykonávania prevádzkovateľov a alebo

Operand 1.

Operand 2.

Tabuľka 14.7. Výsledky vykonávania prevádzkovateľa nie

Prevádzkovateľ platobného potvrdenia typu

Prevádzkovateľ potvrdeniatYPOF vráti reťazec opisujúci typ dát operandu. Operand, typ, ktorý potrebujete vedieť, je umiestnený po tomto operácii a zadajte zátvorky:

s \u003d typ ("str");

V dôsledku vykonávania tohto výrazu v premennej bude reťazec "reťazec", označujúci typ reťazca.

Všetky hodnoty, ktoré sa môže operátor typeOF vrátiť, sú uvedené v tabuľke. 14.8.

Tabuľka 14.8. Hodnoty vrátené operátorom typu

Dátový typ

Spiatočný riadok

Reťazec

Číselný

Tabuľka 14.8 (koniec)

Dátový typ

Spiatočný riadok

Logický

Konverzia typu kompatibility a údajov

Je čas zvážiť dve ďalšie dôležité otázky: Kompatibilita typov údajov a konverziu jedného typu na druhú.

Čo sa stane, ak sa skladajú dve číselné hodnoty? To je pravda - iná číselná hodnota. A ak zložíte číslo a reťazec? Je ťažké povedať ... Tu JavaScript čelí problém nekompatibility typov údajov a pokúsi sa robiť tieto typy kompatibilné, transformovať jeden z nich do druhého. Po prvé, snaží sa previesť riadok na číslo a, ak riadi, vykonáva pridanie. V prípade zlyhania sa číslo bude transformovať na reťazec a dve získané rady budú kombinované. Napríklad v dôsledku implementácie webového scenára zo zoznamu 14.6, hodnota premennej B pri pridávaní z premennej A sa bude previesť na číselný typ; Premenná C teda bude obsahovať hodnotu 23.

Zoznam 14.6.

var a, b, c, d, e, f; A \u003d 11;

b \u003d "12"; C \u003d A + B;

d \u003d "javascript"; E \u003d 2;

Keďže hodnota premennej d nie je možné previesť na číslo, hodnota E bude prevedená na reťazec a výsledok - hodnota F - bude rovná

Logické hodnoty sa konvertujú buď na číselné alebo v reťazci, v závislosti od konkrétneho prípadu. Skutočná hodnota bude prevedená na číslo 1 alebo reťazec "1" a hodnotu false - v 0 alebo "0". Naopak, číslo 1 sa bude konvertovať na TRUE, a číslo 0 je na FALSE. Tiež vo falošnom budú transformované

null a nedefinované hodnoty.

Časť III. Webové stránky správania. Webové scenáre

Je možné vidieť, že sa bojuje JavaScript, aby správne fungovali ešte nesprávne napísané výrazy. Niekedy sa ukáže, ale častejšie všetko funguje podľa plánu a nakoniec, implementácia webového scenára je prerušená v súvislosti s detekciou chyby úplne na jeho inom mieste, na absolútne správne vyhlásenie. Preto je lepšie zabrániť takýmto incidentom.

Priorita prevádzkovateľov

Posledná otázka, ktorú tu pozrieme, sú prioritou prevádzkovateľov. Ako si pamätáme, priorita ovplyvňuje poradie, v ktorom sa prevádzkovatelia vykonávajú vo výraze.

Nech je nasledujúci výraz:

V tomto prípade sa najprv na hodnotu premennej bude pridaná do C, a potom 10 bude odpočítaná od sumy. Prevádzkovatelia tohto výrazu majú rovnakú prioritu, a preto sa striktne ponechávajú vpravo.

Teraz zvážte takýto výraz:

Tu sa najprv vykoná násobenie hodnoty C o 10 a až potom bude pridaná hodnota B k výsledku. Multiplikačný operátor má väčšiu prioritu ako prevádzkovateľ pridávania, takže objednávka "striktne odišiel doprava".

Najnižšia priorita pre prevádzkovateľov zadania. Preto sa vypočíta samotný výraz a potom je jeho výsledok priradený premennej.

V všeobecne platí, že základná zásada plnenia všetkých operátorov je nasledovná: Prví prevádzkovatelia sa vykonávajú s vyššou prioritou a len neskôr prevádzkovatelia s nižšou. Prevádzkovatelia s rovnakou prioritou sa vykonávajú v poradí z nich (zľava doprava).

V tabuľka. 14.9 Prevádzkovatelia študovali nás sú uvedené v poradí podľa ich priorít.

Tabuľka 14.9. Priorita operátorov (v zostupnom poradí)

Operátorov

Popis

++ - - - ~! Typ.

Prírastok, zmenšenie, zmena, logické nie, definícia

Multiplikácia, rozdelenie

Pridávanie a zlúčenie riadkov, odčítanie

Porovnanie operátorov

Logické I.

Kapitola 14. Úvod do webového programovania. Javiskový jazyk JavaScriptu

Tabuľka 14.9 (koniec)

Operátorov

Popis

Logické alebo

Podmienečný operátor (pozri nižšie)

= <оператор>=

Priradenie, jednoduché a komplexné

Pozor!

Pamätajte na túto tabuľku. Nesprávny postup vykonávajúcich operátorov môže spôsobiť ťažké chyby, v ktorých externe absolútne správny výraz poskytuje nesprávny výsledok.

Ale čo keby sme potrebovali prelomiť obvyklý poriadok vykonávania operátorov? Používame konzoly. S takýmto vstupom uzavretou v zátvorkách sa prevádzkovatelia vykonávajú ako prvý:

a \u003d (B + C) * 10;

Tu bude prvá prídavka hodnôt premenných B a C dokončená, a potom sa výsledná suma vynásobí 10.

Prevádzkovatelia uzavreté v zátvorkách sú tiež predmetom priority. Preto sa často používajú viaceré konzoly:

a \u003d ((B + C) * 10 - D) / 2 + 9;

Prevádzkovatelia tu budú vykonaní v takom poradí:

1. Dodatok B a C.

2. Vynásobením sumy prijatej 10.

3. Odčítajte D z práce.

4. Rozdelenie rozdielu pre 2.

5. Pridržujte 9 súkromných.

Ak odstránite konzoly:

a \u003d B + C * 10 - D / 2 + 9;

poradie vykonávania prevádzkovateľov bude:

1. Násobenie C a 10.

2. Rozdelenie D až 2.

3. Dodatok B a pracuje C a 10.

4. Odčítanie z prijatých množstva súkromného z divízied 2.

5. Nastavený 9 získaným rozdielom.

Ukazuje sa úplne iný výsledok, že?

JavaScript. alebo Js. (Skrátený) Nie je to jednoduchý jazyk a nováčikoví vývojári o tom okamžite nevedia. Spočiatku uznávajú základy a všetko sa zdá byť farebné a krásne. Hľadáte trochu hlbšie, javascript sa objaví polia, objekty, spätné volania a všetko, čo tak často robí mozog.

JavaScript je dôležitý pre správne kontrolu typu premennej. Predpokladajme, že chcete vedieť, či je premenná s poleom alebo objektom? Ako to skontrolovať správne? V tomto konkrétnom prípade sa počas kontroly existujú triky, a to bude tento záznam. Poďme okamžite pokračovať.

Kontrola premenlivého typu

Napríklad, musíte skontrolovať, je premenná objektov, pole, reťazec alebo číslo. Ak to chcete urobiť, môžete použiť TYPOF, ale nebude vždy dať pravdu av príklade nižšie, ukážem prečo.

Tento príklad som napísal, že TOPEOF nie je vždy správna voľba.

Var _compaison \u003d (String: "reťazec", Int: 99, float: 13.555, objekt: (Ahoj: "HI"), pole: Nové pole (1, 2, 3)); // Vráťte pole s kľúčmi objektov VAR _objkeys \u003d object.Keys (_Compaison); pre (var i \u003d 0; ja<= _objKeys.length - 1; i++) { // выведем в консоль тип каждой переменной console.log(typeof _comparson[_objKeys[i]]); }

Výsledok vykonania kódu:

Číslo číselného čísla Objekt Objekt

Správny? - Samozrejme, že nie. Existujú dva problémy. Každý z nich bude podrobne opísaný a navrhovaný.

Prvý problém: Číslo float, výstup ako číslo

Porovnanie.Float nie je číslo a namiesto čísla musí byť float (číslo plávajúceho bodu). Toto je pevné, môžete vytvoriť kontrolu funkcie ako v nižšie uvedenom kóde.

Var _floatnumber \u003d 9,22; var _notfloadnumber \u003d 9; Console.log (IsFloat (_FloatNumber); Konzoly.log (IsFloat (_notfloatNumber); Console.log (IsFloat (")); Funkcia ISFLOT (n) (návratové číslo (n) \u003d\u003d\u003d n && n% 1! \u003d\u003d 0;)

Funkcia ISFLOAT () vykonáva kontrolu všetkých hodnôt do čísel plávajúceho bodu. Sa najprv skontroluje, či je premenná rovná n. Číslo (číslo (n) \u003d\u003d\u003d n) a ak áno, potom sa vykoná ďalšia kontrola validácie s zvyškom a ak existuje zvyšok, potom sa vráti BULVA ( pravda. alebo falošný) Výsledok (n% 1! \u003d\u003d 0).

V tomto príklade sa vracia pravda., falošný a falošný. Prvá hodnota je plavák.typ, druhý nie je - toto je obvyklé číslo a posledný len prázdny reťazec, ktorý nevyhovuje pravidlám.

Druhý problém: pole bolo stanovené ako objekt

V prvom príklade sa pole zobrazilo ako objekt a to nie je veľmi dobré, pretože niekedy musíte použiť tento konkrétny typ a nič viac.

Existuje niekoľko spôsobov, ako skontrolovať premennú na type poľa.

Prvá možnosť (dobrá voľba). Skontrolujte príslušenstvo s údajmi na pole pomocou InstanceOF ().

Var dát \u003d Nové pole ("Ahoj", "svet"); Var isarr \u003d dáta inštancie pole;

Druhá verzia (dobrá voľba). Metóda array.isarray () vráti booleanovú hodnotu, ktorá bude závisieť od toho, či je premenná pole alebo nie ().

Var dát \u003d Nové pole ("Ahoj", "svet"); varisar isarr \u003d array.isarray (údaje);

Tretia možnosť (najlepšie, ale dlhé). Pre pohodlie môžete vykonať túto cestu. Použitie objektu, robíme. Ak je výsledok object.prototype.Tostring.call (dáta) nie je rovná premennej nie je pole ().

Var dát \u003d Nové pole ("Ahoj", "svet"); var isarr \u003d object.prototyp.tostring.call (dáta) \u003d\u003d ""; Console.log (ISARR);

Posledný výsledok vo forme pohodlnej funkcie:

Funkcia isarray (dáta) (návrat objekt.prototype.tostring.call (dáta) \u003d\u003d "")

Teraz môžete zavolať funkcie isarray () a ako argument, aby ste nastavili pole alebo niečo iné a videli výsledok.

Afterword

Nahrávanie sa ukázalo ako veľmi veľké, ako sa pôvodne myslelo. Ale som s ním spokojný, pretože krátko a jasne opisuje ťažkosti pri kontrole premenných v Javascript a ako sa k nim dostať.

Ak máte akékoľvek otázky, napíšte ich nižšie k tomuto záznamu. Budem rád pomôcť.

  • Nedefinované: nedefinované
  • NULL: "Objekt"
  • Boolean: "Boolean"
  • Číslo: "Číslo"
  • String: "reťazec"
  • Funkcia: "Funkcia"
  • Všetko ostatné: "objekt"

Do tejto tabuľky by sa mali doplniť tieto pripomienky: \\ t

1. Typof null \u003d\u003d\u003d "objekt".

Teoreticky tu je jemný okamih. V jazykoch so statickým typom nesmie premenná typu objektu obsahovať objekt (, nil, nulový ukazovateľ).

Prakticky - JavaScript je nepohodlný. Preto es 5.1 vývojári sa chystajú intuitívnejšia vec: TYPOF NULL \u003d\u003d\u003d "null".

Ale keďže máme stále kruh ES3, nerobte chybu, napríklad na to:

/ * Funkcia hľadá nejaký objekt a vráti ho alebo , ak nie je nájdené ničím / funkčné vyhľadávanie () () var obj \u003d vyhľadávanie (); IF (TYPOF OBJ \u003d\u003d\u003d "Objekt") (// či sme naozaj našli objekt (zlyhanie) obj.method ();)

2. Nezabudnite na objekty Wrapper (TAPEOF NOVÉ ČÍSLO (5) \u003d\u003d\u003d\u003d "Objekt").

3. A nezabudnite na správne prehliadače vytvoriť čokoľvek s hostiteľskými objektmi.

Nenechajte sa prekvapiť, že safari vytrvalo považuje htmlcollection podľa typu funkcie, a tj skôr ako 9. verzia Udržujte naše obľúbené upozornenie () pre objekt. Tiež chróm používal na čítanie regexp pre funkciu, ale teraz sa zdá, že je vytvorené a odpovedá na to objekt.

natiahnuť ()

Snažím sa zistiť typ hodnoty podľa jeho metódy TOSTRING (), je bezvýznamný. Vo všetkých triedach je táto metóda prepísaná na jeho.

Pre výstup informácií ladenia je metóda dobrá, ale typ premennej to neurčuje.

Object.prototyp.ToString ()

Aj keď je Tostring prepísaný v rámci špecifických "tried", stále máme svoju počiatočnú implementáciu z objektu. Pokúsme sa ho použiť:

Console.log (objekt .prototyp .Tostring .call (hodnota));

konzola.log (object.prototype.tostring.call (hodnota));


Clinton zriedi tento pulómotín

Podivne, táto metóda funguje prekvapivo dobre.

Pre skalárne typy, návrat ,,,

Zábavná vec je, že aj nové číslo (5), na ktorom tu TYTF scribbred sa vracia.

Na null a nedefinovaný spôsob, ako dávať zlyhania. Rôzne prehliadače sa vracajú, potom sa očakávajú, a potom vo všeobecnosti. Je však ľahké určiť typ týchto dvoch hodnôt a bez neho.

Zaujímavé začína, keď sa približujeme k objektom (tie, ktoré majú TOPEOF \u003d\u003d\u003d "objekt").

vstavané objekty pracujú, prakticky, s treskom:

  • {} —
  • Dátum -
  • Chyba -
  • Regexp -

Jediný vypadne z zoznamu argumentov, čo je to.
S hostiteľskými objektmi, opäť horšie.

V IE, DOM Objekty sa začali stať "normálnymi" objektmi len z 8. verzie a potom nie do konca. Preto, v IE 6-8, všetky tieto objekty (HTMLCOLLOCTION, DOMELEDY, TEXTNODE, A ZAPNUTÉ DOKUMENTY A DOKUMENTY AKOĽVEK) sú jednoducho poháňané.

Vo všetkých ostatných prehliadačoch (vrátane IE9) s výsledkom TOSTRING môžete niečo urobiť. Hoci všetko nie je príliš jednoduché: HTMLCOLLOCTION TAK TAK. Okno - potom. Ale z toho sa môžete pokúsiť niečo vzrušiť.

S DOMELEMENTOM: Zobrazí sa vo forme - jeho formát pre každú značku. Ale tu pravidelne nám pomôže.

S inými hostiteľskými objektmi (v testoch umiestnenia a navigátora) o rovnakom príbehu. Všade, okrem IE, môžu byť identifikované podľa riadku.

Mines použitia objektu.Prototype.ToString ():

1. Možnosť toho nie je vysvätená štandardom. A radšej by sme sa tu mali radovať, že všetko funguje tak dobre, a nie rozdrviť o nejaké chyby.

2. Určenie typu na vzorov syntaxe reťazca, ktorý sa vráti metódou, ktorý nie je vôbec určiť typ, a je stále spôsobený v zariadení, ku ktorému sa netýka, necháva niektoré zrazeniny na sprche.

3. V starej IE, ako je možné vidieť, hostiteľské objekty nie sú normálne identifikované.

Toto je však úplne pracovná vec, keď sa používa v spojení s inými prostriedkami.


Dizajnéri

A konečne, dizajnéri. Kto môže lepšie povedať o objekte "triedy" v JS, ak nie jeho dizajnér?

Null a nedefinované nemajú žiadne objekty alebo dizajnéri.

Zostávajúce skalárne typy obalu majú, resp. Môžete získať konštruktor:

(5) .constructor \u003d\u003d\u003d číslo; (Číslo .Nan) .constructor \u003d\u003d\u003d číslo; (True) .constructor \u003d\u003d\u003d boolean; ("Reťazec") .constructor \u003d\u003d\u003d reťazec;

(5) .constructor \u003d\u003d\u003d číslo; (Number.NAN). Konštrukčný kód \u003d\u003d\u003d číslo; (True) .constructor \u003d\u003d\u003d boolean; ("Reťazec"). Konštruktér \u003d\u003d\u003d reťazec;

Instanceof tu však neprejde:

5 Obchodné číslo; // nepravdivé číslo. // falošná skutočná inštancia boolean; // false "reťazec" instancef reťazec; // FALSE

5 Obchodné číslo; // FALSE NUMBERY.NAST INSTAUME NUMBERY; // falošná skutočná inštancia boolean; // false "reťazec" instancef reťazec; // FALSE

(Instancaf bude fungovať pre dlhodobé nové číslo (5))

S funkciami (ktoré sú tiež objekty) a inštancie:

Console.Log ((funkcia () () ()) Instanicaf Funkcia); // pravá konzola.log ((funkcia () ()) .constructor \u003d\u003d\u003d funkcia); // pravda.

console.Log ((funkcia () () ()) Instanicaf Funkcia); // pravá konzola.log ((funkcia () ()). Konštruktér \u003d\u003d\u003d funkcia); // pravda.

Všetky vložené triedy sú tiež ľahko identifikované dizajnéri: pole, dátum, regexp, chyba.

Jeden problém sa tu vyskytuje s argumentmi, konštruktéra toho objektu.

A druhá s samotným objektom, alebo skôr, ako atribútovať objekt vytvorený prostredníctvom projektanta používateľa.

Takže môžete definovať iba základný objekt:

objstavový objekt;

Ako jeden z variantov definície - presunúť všetky ostatné možné typy (pole, chybové ...) a ak ani pod ním nebudú podkopať - "objekt".

Dizajnéri a hostiteľské objekty

S hostiteľskými objektmi sú horšie.

Začnime so skutočnosťou, že tj až do 7. verzie inkluzívne nepovažuje ich vôbec pre normálne objekty. Jednoducho nemajú dizajnérov a prototypy (v každom prípade, programátor ich nedosiahne).

V iných prehliadačoch sú lepšie. Dizajnéri sú a môžete definovať hodnotovú triedu. Nazývajú sa len v rôznych prehliadačoch rôznymi spôsobmi. Napríklad, pre htmlcollection, dizajnér bude buď htmlcollection alebo nodulist, alebo dokonca nodulistconstructor.

Mali by ste tiež definovať základného dizajnéra pre domelement. V FF, to napríklad htmlelement, z ktorého sú už zdedené htmldvivement a ďalšie.

Firefox je hodený do Firefoxu pod 10. verziou a operou pod 11. K dispozícii je zbierka konštruktér - objekt.

konštruktér.Name.

Viac konštruktora má názov vlastnosti, ktorá môže byť užitočná.

Obsahuje názov funkcie dizajnéra, napríklad (5) .constructor.Name \u003d\u003d\u003d "Číslo".

Ale:
1. V IE to nie je ani, ani v 9. mieste.
2. V hostiteľských objektoch sú prehliadače znova zatlačili každý, že veľa (a často nemajú túto nehnuteľnosť vôbec). V Opera je domement názov dizajnéra vo všeobecnej funkcii.Prototyp.
3. Argumenty opäť "objekt".

závery

Žiadna z prezentovaných metód nedáva sto percent definície typu / triedy hodnoty vo všetkých prehliadačoch. Avšak v agregácii to umožňujú urobiť.

V blízkej budúcnosti sa budem snažiť zhromaždiť všetky údaje v značkách a uviesť príklad funkcie definície.



Páči sa vám článok? Zdieľaj to