Contacte

Tipul operatorului de primire. JavaScript, TypeOf, Tipuri și clase JavaScript Verificați tipul de variabilă

Identificarea dinamică a tipurilor

Identificarea tipului dinamic (RTTI) Vă permite să determinați tipul de obiect în timpul executării programului. Se pare că este utilă din mai multe motive. În special, prin referire la clasa de bază, este posibil să determinați destul de precis tipul de obiect disponibil la această legătură. Identificarea dinamică a tipurilor face, de asemenea, posibilă verificarea în avans cât de succes va rezulta rezultatul tipului de tip, împiedicând situația exclusivă în legătură cu vizualizarea incorectă a tipurilor. În plus, identificarea dinamică a tipurilor este principala componentă a reflecției.

Pentru a sprijini identificarea dinamică a tipurilor în C #, sunt furnizate trei cuvinte cheie: este, ca și tipoul. Fiecare dintre aceste cuvinte cheie este considerat în continuare la rândul său.

Operatorul este.

Tipul specific de obiect poate fi determinat utilizând operatorul este utilizat. Mai jos este forma sa comună:

este expresia tipului

În cazul în care expresia denotă o expresie separată care descrie obiectul al cărui tip este verificat. Dacă expresia are un tip compatibil sau același tip, deoarece tipul a fost verificat, rezultatul acestei operații este adevărat, altfel fals. Astfel, rezultatul va fi adevărat dacă expresia are un tip verificabil într-o formă sau altul. În instrucțiunea de tip este, ambele sunt definite ca fiind compatibile dacă sunt de același tip sau dacă sunt furnizate transformări de referință, ambalare sau despachetare.

Mai jos este un exemplu de utilizare a unui operator este:

Folosind sistemul; NameSpace ConsoleApplication1 (Clasa Adăugați () Suma de clasă: Adăugați () Programul de clasă (Static VOD () (Adăugați a \u003d New Add (); Sum S \u003d Noua sumă (); dacă (A este adăugat) console.Writeline ("variabilă A a fost adăugat "); dacă (s este sum) consolă.writerită (" tipul de variabile s este moștenit din clasa AD "); consola.Readline ();)))

Operator ca.

Uneori, conversia de tip este necesară în timpul executării, dar nu generează o excepție dacă rezultatul acestei conversii va fi nereușit, ceea ce este foarte posibil atunci când tipurile sunt date. În acest scop, operatorul în timp ce are următoarea formă:

ca expresie de tip

unde expresia denotă o expresie separată care este convertită la tipul specificat.

Dacă rezultatul unei astfel de conversii se dovedește a avea succes, atunci link-ul la tipul este returnat și altfel este o legătură goală. Operatorul în calitate de operator poate fi utilizat numai pentru a converti legăturile, identitatea, ambalarea, despachetarea. În unele cazuri, operatorul în calitate de operator poate servi ca o alternativă convenabilă la operatorul este. De exemplu, luați în considerare următorul program:

Folosind sistemul; NameSpace ConsoleApplication1 (Clasa Adăugare () Suma de clasă: Adăugați () Programul de clasă (static VOID principal (); suma s \u003d noua sumă (); // Efectuați anunțul de tip A; dacă (A! \u003d Null) consola.Writeri ("Convertirea a avut succes"); altcineva consola.Writeline ("Eroare convertirea"); consola.Readline ();)))

Rezultatul acestui program va fi o conversie de succes.

a \u003d (b\u003e 0) && (c + 1! \u003d d); Steag \u003d! (Stare \u003d 0);

Tabelul 14.5. Operatori logici

Descrierea operatorului

! Nu (inversiune logică)

&& Și (multiplicare logică)

|| Sau (adăugare logică)

Tabelul 14.6. Rezultatele executării operatorilor și sau sau

Operand 1.

Operand 2.

Tabelul 14.7. Rezultatele executării operatorului nu

Tipul operatorului de primire

Tip operator de primiretipul returnează un șir care descrie tipul de date operand. Operand, tipul de care trebuie să știți sunt plasate după acest operator și intrați în paranteze:

s \u003d Tipul ("Str");

Ca urmare a executării acestei expresii în variabila S va fi un șir "șir", care denotă un tip de șir.

Toate valorile pe care operatorul de tipare le poate returna sunt enumerate în tabel. 14,8.

Tabelul 14.8. Valorile returnate de către operatorul de tip

Tipul de date.

Linia de întoarcere

Şir

Numeric

Tabelul 14.8 (sfârșitul)

Tipul de date.

Linia de întoarcere

Logic

Conversia compatibilității și a tipului de date

Este timpul să luăm în considerare două probleme mai importante: compatibilitatea tipurilor de date și convertirea unui tip la altul.

Ce se întâmplă dacă sunt pliate două valori numerice? Așa este - o altă valoare numerică. Și dacă pliați numărul și șirul? Este greu de spus ... Aici JavaScript se confruntă cu problema incompatibilității tipurilor de date și încearcă să facă aceste tipuri compatibile, transformând unul la altul. În primul rând, încearcă să transforme un rând la număr și, dacă administrează, efectuează adăugarea. În caz de eșec, numărul va fi transformat în șir, iar cele două rânduri obținute vor fi combinate. De exemplu, ca urmare a implementării scenariului web din listă 14.6, valoarea variabilei B atunci când se adaugă din variabila A va fi transformată într-un tip numeric; Astfel, variabila C va conține o valoare 23.

Listarea 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;

Dar, deoarece valoarea variabilei D nu poate fi convertită într-un număr, valoarea E va fi convertită în șir și rezultatul - valoarea F - va deveni egală

Valorile logice sunt convertite fie la numerice, fie în șir, în funcție de cazul specific. Valoarea reală va fi convertită în numărul 1 sau șirul "1", iar valoarea falsă - în 0 sau "0". În schimb, numărul 1 va fi convertit într-adevăr, iar numărul 0 este fals. De asemenea, în fals vor fi transformate

valori nul și nedefinite.

Partea a III-a. Pagini web de comportament. Scenariile web

Se poate observa că luptele JavaScript pentru a efectua corect chiar expresii scrise incorect. Uneori se dovedește, dar mai des funcționează așa cum este planificat și, în cele din urmă, punerea în aplicare a scenariului web este întreruptă în legătură cu detectarea unei erori complet în celălalt loc, pe o declarație absolut corectă. Prin urmare, este mai bine să preveniți astfel de incidente.

Prioritatea operatorilor

Ultima întrebare pe care o vom arăta aici sunt prioritatea operatorilor. După cum ne amintim, prioritatea afectează ordinea în care operatorii sunt efectuați în expresie.

Să fie următoarea expresie:

În acest caz, în primul rând la valoarea variabilei B va fi adăugată la C, iar apoi 10 vor fi deduse din sumă. Operatorii acestei expresii au aceeași prioritate și, prin urmare, rulează strict la dreapta.

Acum, luați în considerare o astfel de expresie:

Aici, mai întâi va fi efectuată multiplicarea valorii C cu 10 și numai atunci valoarea B va fi adăugată la rezultat. Operatorul de multiplicare are o prioritate mai mare decât operatorul de adăugare, astfel încât ordinea "strict lăsată la dreapta" va fi întreruptă.

Cea mai mică prioritate pentru operatorii de atribuire. Acesta este motivul pentru care expresia în sine este calculată și apoi rezultatul este atribuit unei variabile.

ÎN În general, principiul de bază al îndeplinirii tuturor operatorilor este după cum urmează: Primii operatori sunt efectuați cu o prioritate mai mare și numai operatorii mai târziu cu mai mici. Operatorii cu aceeași prioritate sunt efectuate în ordinea lor (de la stânga la dreapta).

ÎN masa. 14.9 Operatorii studiați de noi sunt enumerați în ordinea priorităților lor.

Tabelul 14.9. Prioritatea operatorilor (în ordinea descrescătoare)

Operatori

Descriere

++ - - ~! Tip de.

Increment, decrement, schimbare semn, logic, definiție

Multiplicare, diviziune, luând un echilibru

Adăugarea și fuziunea rândului, scăderea scăderii

Comparația operatorilor

Logic I.

Capitolul 14. Introducere în programarea web. Limba JavaScript.

Tabelul 14.9 (sfârșitul)

Operatori

Descriere

Logical sau

Operator condiționat (vezi mai jos)

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

Cesiune, simplă și complexă

ATENŢIE!

Amintiți-vă de această masă. Procedura incorectă pentru operatorii performanți poate provoca erori dificile în care expresia externă absolut corectă oferă un rezultat incorect.

Dar dacă trebuie să distrugem ordinea obișnuită de execuție a operatorilor? Folosim paranteze. Cu o astfel de intrare închisă în paranteze, operatorii sunt executați mai întâi:

a \u003d (b + c) * 10;

Aici, mai întâi, adăugarea de valori ale variabilelor B și C va fi finalizată și apoi suma rezultată va fi înmulțită cu 10.

Operatorii anexați în paranteze sunt, de asemenea, supuse priorității. Prin urmare, mai multe paranteze sunt adesea utilizate:

a \u003d ((b + c) * 10 - d) / 2 + 9;

Aici operatorii vor fi efectuați într-o astfel de secvență:

1. Adăugarea B și C.

2. Înmulțirea sumei primite cu 10.

3. Scade D din muncă.

4. Divizia unei diferențe pentru 2.

5. ADAMENTUL 9 LA PRIVAT.

Dacă eliminați paranteze:

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

ordinul de execuție a operatorilor va fi:

1. Multiplicarea C și 10.

2. Împărțirea D la 2.

3. Adăugarea B și lucrările C și 10.

4. Scăderea din suma primită de privat din diviziuned 2.

5. A ajustat 9 la diferența obținută.

Se pare un rezultat complet diferit, nu?

JavaScript. sau Js. (Abreviat) Nu este un limbaj simplu și dezvoltatorii novici nu vor ști imediat despre asta. La început recunosc elementele de bază și totul pare colorat și frumos. Căutați un pic mai profund, JavaScript apare matrice, obiecte, apeluri și tot ce face adesea creierul.

JavaScript este important pentru a verifica corect tipul de variabilă. Să presupunem că doriți să știți dacă o variabilă cu o matrice sau obiect? Cum să verificați corect? În acest caz particular, există trucuri în timpul inspecției și aceasta va fi această intrare. Să continuăm imediat.

Verificarea tipului variabil

De exemplu, trebuie să verificați este o variabilă obiect, o matrice, un șir sau număr. Pentru a face acest lucru, puteți folosi tipul, dar nu va da întotdeauna adevărul și în exemplul de mai jos voi arăta de ce.

Am scris acest exemplu pentru a arăta în mod viu de ce tipul nu este întotdeauna alegerea potrivită.

Var _comprafie \u003d (string: "șir", int: 99, float: 13.555, obiect: (salut: "hi"), matrice: o nouă matrice (1, 2, 3)); // returnați o matrice cu cheile obiectului VAR _OBJKEYS \u003d obiect.keys (_Comprafie); pentru (var i \u003d 0; i<= _objKeys.length - 1; i++) { // выведем в консоль тип каждой переменной console.log(typeof _comparson[_objKeys[i]]); }

Rezultatul executării codului:

Număr de număr Număr Object Obex

Dreapta? - Desigur că nu. Există două probleme. Fiecare dintre ele va fi descris în detaliu și sugerată.

Prima problemă: numărul float, ieșire ca număr

Comparație.float nu este un număr și în loc de număr trebuie să fie flotor (un număr de punct plutitor). Acest lucru este fix, puteți crea o funcție de verificare ca în codul de mai jos.

VAR _FLOATNumber \u003d 9.22; var _notfloanumber \u003d 9; Consola.log (isfloat (_floatnumber)); Consola.log (isfloat (_notfloatnumber)); Consola.log (izfloat (")); FUNCȚIA ISFLOAT (N) (numărul de retur (N) \u003d\u003d\u003d N && N% 1! \u003d\u003d 0;)

Funcția ISFLOAT () efectuează verificarea tuturor valorilor numerelor de puncte plutitoare. Este mai întâi verificată dacă variabila este egală n. Numărul (numărul (N) \u003d\u003d\u003d n) și dacă da, atunci se efectuează o altă verificare de validare cu reziduul și dacă există un reziduu, atunci Buleva se întoarce ( adevărat. sau fals) Rezultat (N% 1! \u003d\u003d 0).

În exemplul de mai sus se întoarce adevărat., fals și fals. Prima valoare este plutitipul, al doilea nu este - acesta este numărul obișnuit și ultimul șir gol care nu corespunde regulilor.

A doua problemă: matricea a fost determinată ca obiect

În primul exemplu, matricea a fost afișată ca obiect și nu este foarte bun, deoarece uneori trebuie să utilizați acest tip particular și nimic mai mult.

Există mai multe modalități de a verifica variabila pe tipul de matrice.

Prima opțiune (o opțiune bună). Verificați accesoriul de date la matrice utilizând instanța ().

VAR DATA \u003d Array nou ("Bună ziua", "Lumea"); VaS ISARR \u003d instanta de date;

A doua versiune (opțiune bună). Metoda Array.isarray () returnează valoarea booleană, care va depinde de faptul dacă variabila este o matrice sau nu ().

VAR DATA \u003d Array nou ("Bună ziua", "Lumea"); VAR ISARR \u003d Array.Sarray (date);

A treia opțiune (cea mai bună, dar lungă). Pentru comoditate, puteți face astfel funcția. Folosind obiectul, facem. Dacă rezultatul Object.protype.tostring.Call (date) nu este egal cu variabila nu este o matrice ().

VAR DATA \u003d Array nou ("Bună ziua", "Lumea"); Var ISARR \u003d obiect.protype.tostring.call (date) \u003d\u003d ""; Consola.log (ISARR);

Ultimul rezultat sub forma unei funcții convenabile:

Funcție isarray (date) (Return Object.protype.tostring.Call (date) \u003d\u003d "")

Acum puteți apela funcțiile Isarray () și ca argument pentru a seta o matrice sau altceva și pentru a vedea rezultatul.

Postfaţă

Înregistrarea sa dovedit destul de mare decât gândirea inițial. Dar sunt mulțumit de el, pentru că descrie pe scurt și descrie în mod clar dificultățile când verificați variabilele din JavaScript și cum să le obțineți în jurul lor.

Dacă aveți întrebări la stânga - scrieți-le mai jos la această înregistrare. Voi fi fericit să vă ajut.

  • Nedefinit nedefinit
  • Null: "obiect"
  • Boolean: "Boolean"
  • Număr: "Număr"
  • Șir: "șir"
  • Funcție: "Funcție"
  • Orice altceva: "Obiect"

Următoarele comentarii trebuie adăugate la acest tabel:

1. Tipul null \u003d\u003d\u003d "obiect".

Teoretic aici este un moment subtil. În limbile cu tastarea statică, variabila de tip obiect nu poate conține un obiect (, nul, zero pointer).

Practic - JavaScript este incomod. Prin urmare, dezvoltatorii Es 5.1 vor face un lucru mai intuitiv: Tipul Null \u003d\u003d\u003d "Null".

Dar din moment ce avem încă un cerc de ES3, nu facem o greșeală, de exemplu, în acest sens:

/ * Funcția este în căutarea unui obiect și returnează-l sau null dacă nu se găsește nimic * / căutare de funcții () () var obj \u003d căutare (); dacă (tastați Obj \u003d\u003d\u003d "obiect") (// indiferent dacă am găsit cu adevărat un obiect (eșec) obj.method ();)

2. Nu uitați de obiecte de învelitoare (tipul de număr nou (5) \u003d\u003d\u003d "obiect").

3. Și nu uitați de browserele potrivite creați orice cu obiecte gazdă.

Nu fi surprins că Safari consideră persistent htmlcollecția de tipul funcției și adică mai devreme decât cea de-a 9-a versiune păstrează funcția noastră de alertă preferată () pentru obiect. De asemenea, Chrome folosit pentru a citi regexp pentru funcție, dar acum se pare că se formează și răspunde obiectului.

tostring ()

Încercarea de a afla tipul de valoare în funcție de metoda de tostring () este lipsită de sens. În toate "clasele", această metodă este suprascrisă la ea.

Pentru ieșirea informațiilor de depanare, metoda este bună, dar tipul de variabilă nu o determină.

Obiect.protype.tostring ()

Deși tostringul este suprasolicitat în cadrul unor "clase" specifice, avem încă implementarea inițială de la obiect. Să încercăm să o folosim:

Consola.log (obiect .protype .Tostring .Call (valoare));

consola.log (obiect.protype.tostring.call (valoare));


Clinton diluează această pulomotorie

Destul de ciudat, această metodă funcționează în mod surprinzător de bine.

Pentru tipurile scalare, întoarcerea ,,,

Lucrul amuzant este că chiar și noul număr (5) pe care tipul scârțâit aici se întoarce.

Pe metoda nulă și nedefinită de a da defecțiuni. Diferitele browsere se întorc, apoi se așteaptă și, apoi, în general. Cu toate acestea, este ușor să determinați tipul acestor două valori și fără ea.

Interesant începe atunci când ne apropiem de obiecte (cele care au tipul "obiect").

obiectele încorporate lucrează, practic, cu un bang:

  • {} —
  • Data -
  • Eroare -
  • Regexp -

Singurul cade din lista argumentelor, care este asta.
Cu obiecte gazdă, mai rău din nou.

În adică, obiectele Dom au început să devină obiecte "normale" numai din a 8-a versiune și apoi nu până la sfârșit. Prin urmare, în IE 6-8, toate aceste obiecte (htmlcollection, domelement, textnode și în același timp document și fereastră) sunt pur și simplu determinate de.

În toate celelalte browsere (inclusiv IE9), cu rezultatul de tostring, puteți face deja ceva. Deși totul nu este ușor: Htmlcollection este acolo, atunci. Fereastră - atunci, atunci. Dar din acest lucru puteți încerca deja să excitați ceva.

Mai dificil cu Domelement: Este afișat în formular - formatul său pentru fiecare etichetă. Dar aici ne vor ajuta în mod regulat.

Cu alte obiecte gazdă (în testele de localizare și navigator) despre aceeași poveste. Peste tot, cu excepția adică, ele pot fi identificate prin rând.

A minusurilor de utilizare a obiectului.protype.tostring ():

1. Posibilitatea acestui lucru nu este consacrată de standard. Și ar trebui să ne bucurăm de aici că totul funcționează atât de bine și să nu zdrobească câteva defecte.

2. Determinarea tipului de pe modelul de sintaxă al șirului returnat prin metoda, care nu este deloc pentru a determina tipul și este încă cauzată de instalația la care nu se aplică, lasă un anumit precipitat pe duș.

3. În vechiul IE, după cum se poate observa, obiectele gazdă nu sunt identificate în mod normal.

Cu toate acestea, acesta este un lucru complet de lucru atunci când este utilizat împreună cu alte mijloace.


Designeri

Și în cele din urmă, designerii. Cine poate spune mai bine despre obiectul "clasă" din JS, dacă nu designerul său?

Null și nedefinit nu au obiecte de înfășurare sau designeri.

Celelalte tipuri scalare de înveliș au, respectiv, puteți obține un constructor:

(5) .Constructor \u003d\u003d\u003d Număr; (Număr .nan) .constructor \u003d\u003d\u003d număr; (Adevărat) .constructor \u003d\u003d\u003d boolean; ("Șir") .constructor \u003d\u003d\u003d șir;

(5) .Constructor \u003d\u003d\u003d Număr; (Număr.nan) .constructor \u003d\u003d\u003d număr; (Adevărat) .constructor \u003d\u003d\u003d boolean; ("Șir"). Constructor \u003d\u003d\u003d șir;

Dar instanța nu trece aici:

Numărul de instanță; // Număr fals .Nan instance insuficient; // fals Booolean Boolean; // string fals "șir de exemplu; // Fals

Numărul de instanță; // Număr fals. Numărul instanței; // fals Booolean Boolean; // string fals "șir de exemplu; // Fals

(Instanța va funcționa pentru un număr nou de suferință pe termen lung (5))

Cu funcții (care sunt și obiecte) și instanțe:

Consola.log ((funcție () () () () instanță); // Consola True.log ((Funcție () ()) .constructor \u003d\u003d\u003d funcția); // Adevărat.

consola.log ((funcție () () () () instanță); // Consola True.Log ((Funcție () ()). Constructor \u003d\u003d\u003d funcția); // Adevărat.

Toate clasele încorporate sunt, de asemenea, ușor identificate de designeri: matrice, data, regexp, eroare.

O problemă apare aici cu argumente, constructorul care obiectul.

Și al doilea cu obiectul în sine sau mai degrabă cum să atribuiți obiectul creat prin designerul de utilizatori.

Deci, puteți defini doar obiectul de bază:

obiectul instanței obj;

Fiind una dintre variantele definiției - pentru a deplasa toate celelalte tipuri posibile (matrice, eroare ...) și dacă nici una sub cel care nu subminează - "Obiect".

Designeri și obiecte gazdă

Cu obiecte gazdă sunt mai rele.

Să începem cu faptul că, până la cea de-a 7-a versiune incluzivă nu le consideră deloc pentru obiecte normale. Pur și simplu nu au designeri și prototipuri (în orice caz, programatierul nu le atinge).

În alte browsere sunt mai bune. Designerii sunt și puteți defini clasa de valori. Ele sunt numite doar în diferite browsere în moduri diferite. De exemplu, pentru HTMLCollection, designerul va fi fie HTMLCollection, fie novelist sau chiar nodelistconstructor.

De asemenea, ar trebui să definiți designerul de bază pentru domelement. În FF, acest lucru, de exemplu, htmlelement, din care sunt deja moștenite HTMLDIVELEMENTIMENT și altele.

Firefoxul este aruncat în Firefox sub cea de-a zecea versiune și operă sub 11. Există un constructor de colectare - obiect.

constructor.name.

Mai mulți constructori au un nume de proprietate care poate fi utilă.

Conține numele funcției de designer, de exemplu, (5) .constructor.name \u003d\u003d\u003d "Număr".

Dar:
1. În adică nu este nici măcar în al 9-lea.
2. În obiecte gazdă, browserele sunt împinse din nou fiecare (și adesea nu au această proprietate deloc). În Opera, domelementul este numele designerului în funcție generală. Prostotip.
3. Argumentele din nou "obiect".

Concluzii

Niciuna dintre metodele prezentate nu oferă o definiție de sută la sută a tipului / clasei de valoare în toate browserele. Cu toate acestea, în agregarea pe care o permit să o facă.

În viitorul apropiat, voi încerca să colectez toate datele din semne și să dau un exemplu de funcție de definiție.



Ți-a plăcut articolul? Împărtășește-l