Névjegyzék

Fogadó üzemeltető. JavaScript, típus, típusok és osztályok JavaScript Ellenőrizze a változó típusát

A típusok dinamikus azonosítása

Dinamikus típusazonosítás (RTTI) Lehetővé teszi, hogy meghatározza az objektum típusát a program végrehajtása során. Számos okból hasznos lehet. Különösen az alaposztályra való hivatkozással lehetséges, hogy pontosan meghatározzák az e linken elérhető objektum típusát. A típusok dinamikus azonosítása lehetővé teszi továbbá, hogy előzetesen ellenőrizzék, hogy a sikeres milyen sikeres lesz a típusok típusának eredménye, megakadályozza az exkluzív helyzetet a típusok helytelen megtekintésével kapcsolatban. Ezenkívül a típusok dinamikus azonosítása a visszaverődés fő összetevője.

A C # típusok dinamikus azonosításának támogatása érdekében három kulcsszó van megadva: az, mint a típusú. Ezen kulcsszavak mindegyike tovább fordul.

Az üzemeltető.

Az adott objektum típusát az üzemeltető segítségével lehet meghatározni. Az alábbiakban a következő formája:

a típus kifejezés

ahol az expresszió egy külön kifejezést jelent, amely leírja azokat az objektumot, amelynek típusát ellenőrizzük. Ha az expresszió kompatibilis vagy ugyanolyan típusú, mint az ellenőrzött típus, ennek a műveletnek az eredménye igaz, ellenkező esetben hamis. Így az eredmény igaz, ha az expresszió egy formában vagy más formában ellenőrizhető típusú. Az IS típusú nyilatkozatban mindkettőt kompatibilisnek kell tekinteni, ha azonos típusúak, vagy ha referencia-átalakítás, csomagolás vagy kicsomagolás biztosított.

Az alábbiakban egy példa a kezelő használatára:

Rendszer használata; Névtér ConsoleApplication1 (Class Add () osztály Összeg: Add () osztály Program (static void main () (Add a \u003d new Add (); SUM S \u003d new sum (), ha (a IS) felvétele Console.WriteLine ( "változó A Hozzáadás: "); ha (S jelentése) konzol.Writeline (" Az S változó típusa öröklődik az AD "osztályból"); konzol.readline ();)

Operátor

Néha a végrehajtás során a típusváltás szükséges, de ne hozzon létre kivételt, ha az átalakítás eredménye sikertelen lesz, ami a típusok megadásakor meglehetősen lehetséges. Ebből a célból az üzemeltetőnek a következő alakja van:

típus kifejezés

amennyiben az expresszió egy külön expressziót jelöl, amelyet a megadott típusra átalakítanak.

Ha az ilyen konverzió eredménye sikeres lesz, akkor a típushoz tartozó hivatkozás visszaküldik, és egyébként üres link. A Mint operátor csak a linkek, az identitás, a csomagolás, a kicsomagolás átalakítására használható. Bizonyos esetekben a mint operátor kényelmes alternatívát jelenthet az üzemeltetőnek. Példaként tekintse meg a következő programot:

Rendszer használata; Namespace CompenEplication1 (osztály hozzáadása () osztályösszeg: Add () osztályú program (statikus void fő (); sum s \u003d új összeg (); ("A konverzió sikeres"); más konzol.writeline ("hiba konvertálás"); konzol.readline ();))))))

A program eredménye sikeres konverzió lesz.

a \u003d (b\u003e 0) && (c + 1! \u003d d); Flag \u003d! (Állapot \u003d 0);

14.5. Táblázat. Logikai üzemeltetők

Kezelő leírása

! Nem (logikai inverzió)

&& És (logikai szorzás)

|| Vagy (logikai kiegészítés)

14.6. Táblázat. Az üzemeltetők végrehajtásának eredményei és vagy

Operand 1.

Operand 2.

14.7. Táblázat. Az üzemeltető végrehajtásának eredményei nem

A fogadó üzemeltető típusa

Írja be az átvételi szolgáltatóta Typeof visszaadja az operandumok típusát leíró karakterláncot. Operand, amelynek típusát kell tudni, az üzemeltető után helyezkednek el, és zárójelekbe kerülnek:

s \u003d típus ("str");

Ennek a kifejezésnek a végrehajtása következtében az S változóban egy karakterlánc "karakterlánc" lesz, amely egy stringtípust jelöl.

Minden olyan érték, amelyet a TypeFer üzemeltető visszatérhet a táblázatban. 14.8.

14.8. Táblázat. A típusú üzemeltető által visszaküldött értékek

Adattípus

Visszatérő vonal

Húr

Számszerű

14.8. Táblázat (vége)

Adattípus

Visszatérő vonal

Logikus

Kompatibilitás és adattípus konverzió

Itt az ideje, hogy fontoljon két fontosabb kérdést: az adattípusok összeegyeztethetősége és az egyik típus konvertálása a másikra.

Mi történik, ha összecsukott két numerikus érték? Ez a helyes - egy másik numerikus érték. És ha a számot és a karakterláncot hajtja végre? Nehéz megmondani ... Itt a JavaScript szembesül az adattípusok összeegyeztethetetlenségének problémájával, és megpróbálja ezeket a típusokat kompatibilisvé tenni, átalakítja az egyiket a másikba. Először is megpróbálja átalakítani a számot a számra, és ha kezeli, elvégzi a kiegészítést. Hiba esetén a szám átalakul a karakterláncba, és a kapott két sor kombinálva lesz. Például a webes forgatókönyv végrehajtása következtében a 14.6. Így a C változó 23 értéket tartalmaz.

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;

De mivel a D változó értéke nem konvertálható számra, az E értéke átalakul a karakterláncba, és az eredmény - az F - értéke egyenlő lesz

A logikai értékeket numerikus vagy karakterláncra alakítják át, az adott esettől függően. Az igazi érték az 1. számra vagy az "1" karakterláncra és a FALSE értékre kerül, 0 vagy "0" értékre. Ezzel szemben az 1-es szám igazra lesz átalakításra, és a 0 szám hamis. Hamisban is átalakulnak

null és meghatározatlan értékek.

III. Rész. Viselkedés weboldalak. Webes forgatókönyvek

Látható, hogy a JavaScript küzd, hogy helyesen helyezze el a helytelenül írott kifejezéseket. Néha kiderül, de gyakrabban működik a tervek szerint, és végül a webes forgatókönyv végrehajtása megszakad a hibás hibás felderítésével kapcsolatban, teljesen helyes nyilatkozaton. Ezért jobb megakadályozni az ilyen eseményeket.

A piaci szereplők prioritása

Az utolsó kérdés, amit itt fogunk nézni, az operátorok elsőbbsége. Mint emlékszem, az elsőbbség befolyásolja azt a rendet, amelyben az üzemeltetők kifejezést hajtanak végre.

Legyen a következő kifejezés:

Ebben az esetben először a B változó értékét hozzáadjuk a C-hez, majd 10 lesz levonva az összegből. Ennek a kifejezésnek az üzemeltetői ugyanolyan prioritással rendelkeznek, és ezért szigorúan balra kell irányulni.

Most vegye figyelembe az ilyen kifejezést:

Itt először a C értékének szorzása 10, és csak akkor a B értéket hozzáadja az eredményhez. A szorzótermelőnek nagyobb prioritása van, mint az addíciós üzemeltető, így a "szigorúan balra" sorrend megszakad.

A megbízóüzemeltetők legalacsonyabb prioritása. Ezért kiszámítják a kifejezést, majd az eredmény egy változóhoz van hozzárendelve.

BAN BEN Általánosságban elmondható, hogy az összes üzemeltető teljesítésének alapelve a következő: az első üzemeltetők magasabb prioritásúak, és csak később alacsonyabbak. Az azonos prioritású operátorokat a sorrendben (balról jobbra) végezzük.

BAN BEN asztal. 14.9 Az általunk vizsgált üzemeltetők a prioritások sorrendjében szerepelnek.

14.9. Táblázat. Az üzemeltetők prioritása (csökkenő sorrendben)

Üzemeltetők

Leírás

++ - - ~! Típusú.

Növekmény, csökkenés, jelváltozás, logikai nem, definíció

Szorzás, divízió, egyensúly megteremtése

Kiegészítés és sor összeolvasztása, kivonás

Az üzemeltetők összehasonlítása

Logikai I.

14. fejezet. Bevezetés a webes programozásba. JavaScript nyelv

14.9. Táblázat (vége)

Üzemeltetők

Leírás

Logikus vagy

Feltételes operátor (lásd alább)

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

Hozzárendelés, egyszerű és összetett

FIGYELEM!

Emlékezzen erre a táblára. Az üzemeltetők hibás eljárása nehéz hibákat okozhat, amelyekben a külsőleg megfelelő kifejezés helytelen eredményt ad.

De mi van, ha meg kell szakítanunk az üzemeltetők végrehajtásának szokásos sorrendjét? Használunk zárójeleket. Egy ilyen zárójelben lévő bejegyzéssel az üzemeltetők először végzik:

a \u003d (B + C) * 10;

Itt először a B és C változók értékeinek hozzáadása befejeződik, majd a kapott mennyiséget megszorozzák 10-vel.

A zárójelben zárt üzemeltetők elsőbbséget élveznek. Ezért a többszörös zárójeleket gyakran használják:

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

Itt az üzemeltetők ilyen sorrendben kerülnek végrehajtásra:

1. Addíció B és C.

2. A kapott összeg megszorozódása 10.

3. kivonja a D-t a munkából.

4. A 2. különbség megosztása.

5. 9-ben a magánszemélynek.

Ha eltávolítja a zárójeleket:

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

az üzemeltetők végrehajtásának sorrendje:

1. C és 10 szorzás.

2. D-t 2.

3. Add hozzá B és C és 10.

4. Kivonás a kapott mennyiségű magánszedésbőld 2.

5. A kapott 9-et a kapott különbséghez igazították.

Teljesen eltérő eredményt kap, ugye?

JavaScript. vagy JS. (Rövidítve) Nem egyszerű nyelv és újvárosi fejlesztők nem fognak azonnal tudni róla. Először felismerik az alapokat, és minden színesnek és szépnek tűnik. Egy kicsit mélyebbre keres, a JavaScript tömbök, tárgyak, visszahívások és minden olyan, mint a gyakran teszi az agyat.

A JavaScript fontos, hogy helyesen ellenőrizze a változó típusát. Tegyük fel, hogy tudni szeretné, hogy egy változó egy tömb vagy tárgy? Hogyan ellenőrizheti igaza? Ebben az esetben vannak trükkök az ellenőrzés során, és ez lesz ez a bejegyzés. Azonnal folytassanak.

Változó típusellenőrzés

Például ellenőriznie kell egy objektumváltozó, egy tömb, karakterlánc vagy szám. Ehhez használhatja a Typefi-t, de nem mindig adja meg az igazságot, és az alábbi példában megmutatom, miért.

Ezt a példát az élénken megmutatom, hogy miért nem mindig a megfelelő választás.

Var _Comparison \u003d (string: "string", int: 99, úszó: 13.555, objektum: (Hello: "Hi"), tömb: új tömb (1, 2, 3)); // visszatér egy tömböt a var _objkeys object \u003d object.keys (_Comparison) gombokkal; mert (var i \u003d 0; i<= _objKeys.length - 1; i++) { // выведем в консоль тип каждой переменной console.log(typeof _comparson[_objKeys[i]]); }

Kódfeltétel Eredmény:

String szám száma objektum objektum

Jobb? - Természetesen nem. Két probléma van. Mindegyikük részletesen ismertetjük és javasoljuk.

Első probléma: úszási szám, kimenet a számként

Összehasonlítás.Float nem szám, és a szám helyett úszik (lebegőpontos szám). Ez rögzítve van, akkor létrehozhat egy ellenőrzési funkciót az alábbi kódban.

Var _floatnumber \u003d 9.22; var _notfloatumber \u003d 9; Konzol.log (ISFloat (_floatnumber)); Konzol.log (isfloat (_notfloatumber)); Konzol.log (isfloat (")); Funkció ISFloat (n) (visszaadási szám (n) \u003d\u003d\u003d n && n% 1! \u003d\u003d 0;)

Az ISFLOAT () funkció az összes érték ellenőrzését végzi a lebegőpontos számokhoz. Először ellenőrizzük, hogy a változó egyenlő-e n. szám (szám (n) \u003d\u003d\u003d n), és ha igen, akkor egy másik érvényesítési ellenőrzés a maradékkal, és ha van maradék, akkor a BuleVa visszatér ( igaz. vagy hamis) Eredmény (N% 1! \u003d\u003d 0).

A fenti példában visszatér igaz., hamis és hamis. Az első érték úszótípus, a második nem - ez a szokásos szám és az utolsó, csak egy üres karakterlánc, amely nem felel meg a szabályoknak.

Második probléma: A tömböt objektumként határoztuk meg

Az első példában a tömb objektumként jelenik meg, és ez nem túl jó, mivel néha ezt a bizonyos típusú és semmi másra kell használnia.

Számos módja van annak, hogy ellenőrizze a változó a tömb típusát.

Első lehetőség (jó lehetőség). Ellenőrizze az adattovábbítást a tömbhöz a példányban ().

VAR DATA \u003d új tömb ("Hello", "Világ"); Var Isarr \u003d Adatszerzés tömb;

Második verzió (jó opció). A tömb.isaray () módszer visszaadja a logikai értéket, amely attól függ, hogy a változó tömb vagy sem ().

VAR DATA \u003d új tömb ("Hello", "Világ"); var Isarr \u003d Array.ISarray (adatok);

Harmadik lehetőség (a legjobb, de hosszú). A kényelem érdekében így működik. Az objektum használatával. Ha az eredmény object.prototype.tostring.call (adatok) nem egyenlő a változó nem tömb ().

VAR DATA \u003d új tömb ("Hello", "Világ"); var isarr \u003d object.prototype.tostring.call (adatok) \u003d\u003d ""; Konzol.log (ISARR);

Az utolsó eredmény egy kényelmes funkció formájában:

Funkció Isarray (adatok) (Visszatérési objektum.prototype.tostring.call (adatok) \u003d\u003d "")

Most hívhatod az Isarray () funkciókat és egy argumentumot, hogy egy tömböt vagy valami mást állítson be, és láthassa az eredményt.

Utólag

A felvétel meglehetősen nagy, mint eredetileg gondolta. De elégedett vagyok vele, mert röviden és egyértelműen leírja a nehézségeket, amikor ellenőrzi a változókat a JavaScriptben és hogyan juthat el körülöttük.

Ha bármilyen kérdése van - írja le az alábbiakat erre a rekordra. Örülök, hogy segítek.

  • Meghatározatlan: meghatározatlan
  • Null: "objektum"
  • Boolean: "Boolean"
  • Szám: "szám"
  • String: "string"
  • Funkció: "Funkció"
  • Minden más: "objektum"

A táblázathoz a következő észrevételeket kell hozzáadni:

1. NULL \u003d\u003d\u003d "objektum" típusa.

Elméletileg itt van egy finom pillanat. A statikus gépeléssel rendelkező nyelveken az objektum típusváltozó nem tartalmazhat objektumot (, nulla, nulla mutató).

Gyakorlatilag - a JavaScript kényelmetlen. Ezért az ES 5.1-es fejlesztők intuitívabbá válnak: NULL \u003d\u003d\u003d "NULL".

De mivel még mindig van egy ES3 körük, ne tévedjünk, például, például:

/ * A funkció néhány objektumot keres, és visszaadja, vagy , ha semmi sem található * / funkciókeresés () () var obj \u003d keresés (); ha (typeof obj \u003d\u003d\u003d\u003d "objektum") (// tényleg találtunk egy objektumot (hiba) obj.method (););)

2. Ne felejtsük el a Wrapper objektumokat (új szám típusa (5) \u003d\u003d\u003d "objektum").

3. És ne felejtsd el, hogy a megfelelő böngészők hozzanak létre semmit a fogadó objektumokkal.

Ne lepődj meg, hogy a Safari tartósan tartja HTMLCollection a funkció típusát, és az IE korábbi, mint a 9. verzió tartani a kedvenc Alert () függvény objektum. A króm is használta a Hegexp funkciót a funkcióhoz, de most úgy tűnik, hogy alkotkozik és válaszol.

tostring ()

Megpróbálja megtudni az értéket a tostring () módszer szerint értelmetlen. Minden "osztályban", ez a módszer felülbírálható.

A hibakeresési információk kimenetére a módszer jó, de a változó típus nem határozza meg.

Object.prototype.tostring ()

Bár a tostringet felülbírálják a konkrét "osztályok", még mindig van kezdeti megvalósítás az objektumból. Próbáljuk meg használni:

Konzol.log (objektum .prototype .tostring .call (érték));

konzol.log (object.prototype.tostring.call (érték));


Clinton hígítja ezt a pullomotint

Furcsa módon ez a módszer meglepően jól működik.

Skaláris típusokhoz, visszatéréshez ,,,,

A vicces dolog az, hogy még az új szám (5), amelyen a Typeof Scribbed itt visszatér.

Null és meghatározatlan módszer a hibák. Különböző böngészők visszatérnek, majd várhatóak, majd általában. Azonban könnyű meghatározni a két érték típusát és anélkül.

Érdekes elkezdődik, amikor megközelítjük az objektumokat (azok, amelyeknek típusa \u003d\u003d\u003d "objektum").

a beépített tárgyak gyakorlatilag egy bangdal dolgoznak ki:

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

Az egyetlen, ami kiesik az érvek listájából, ami ez az.
A fogadó tárgyakkal ismét rosszabb.

Az IE-ben a DOM objektumok csak a 8. verzióból származnak, majd nem a végéig. Ezért az IE 6-8-ban mindezen tárgyakat (htmlcollection, dombement, textnode, és ugyanabban az időben a dokumentum és az ablak) egyszerűen hajtja.

Az összes többi böngészőben (beleértve az IE9-et) a tótrés eredményével már csinálhat valamit. Bár minden nem könnyű is: a htmlcollection ott van. Ablak - akkor, akkor. De ebből már megpróbálhatsz izgatni valamit.

Nehézbb a DOMELEMENT: A formában megjelenik az egyes címkék formátuma. De itt rendszeresen segít nekünk.

Más fogadó tárgyakkal (a helyszínen és a navigátor tesztekben) ugyanazon a történetről. Mindenhol, kivéve az IE, azokat sorak szerint lehet azonosítani.

Az objektum használatával. Prototype.tostring ():

1. Ennek lehetőségét a szabvány nem szenteli. És inkább örülnünk kell, hogy minden olyan jól működik, és nem zúzzák meg néhány hibát.

2. A módszer által visszaküldött karakterlánc szintaxis-mintájának meghatározása, amely egyáltalán nem határozza meg a típusát, és még mindig az a létesítményben, amelyre nem vonatkozik, hagyja, hogy néhány csapadékot a zuhanyra hagyja.

3. A régi, azaz, azaz látható, a fogadó objektumok általában nem azonosíthatók.

Ez azonban teljesen működő dolog, ha más eszközökkel együtt használják.


Tervezők

És végül, tervezők. Ki tudja jobban mondani a JS "osztály" tárgyról, ha nem a tervezője?

Null és nincs meghatározva nincs wapper tárgyak vagy tervezők.

A fennmaradó skaláris típusai a wrapper-t kaphat egy konstruktorhoz:

(5) .constructor \u003d\u003d\u003d szám; (Szám .nan) .constructor \u003d\u003d\u003d szám; (True) .constructor \u003d\u003d\u003d Boolean; ("String") .constructor \u003d\u003d\u003d String;

(5) .constructor \u003d\u003d\u003d szám; (Szám.nan) .constructor \u003d\u003d\u003d szám; (True) .constructor \u003d\u003d\u003d Boolean; ("String"). Constructor \u003d\u003d\u003d String;

De a példány nem jár el itt:

5 példányszám; // hamis szám .nan példányszám; // hamis igazi példány logikai; // hamis "string" példány; // Hamis

5 példányszám; // hamis szám.nan példányszám; // hamis igazi példány logikai; // hamis "string" példány; // Hamis

(A WCSYOF hosszúké válik az új szám (5))

A funkciók (amelyek szintén tárgyak) és példányak:

Konzol.log ((funkció () ()) példány funkció); // true console.log ((funkció () ()) .constructor \u003d\u003d\u003d funkció); // igaz.

konzol.log ((funkció () ()) példány funkció); // true console.log ((funkció () ()). Constructor \u003d\u003d\u003d funkció); // igaz.

Az összes beágyazott osztályt is könnyen azonosítja a tervezők: tömb, dátum, regexp, hiba.

Az egyik probléma itt argumentumokkal történik, amelynek konstruktorja.

És a második pedig maga a tárgy, vagy inkább a felhasználó által létrehozott objektum tulajdonítható.

Tehát csak az alapobjektumot definiálhatja:

oBJ példány objektum;

A definíció egyik változatjaként - az összes lehetséges típus (tömb, hiba) mozgatása, és ha sem az alá nem haladja alá - "objektum".

Tervezők és fogadó objektumok

A fogadó objektumok rosszabbak.

Kezdjük azzal, hogy azaz addig, amíg a 7. verzió befogadó nem veszi figyelembe őket egyáltalán normál objektumok. Egyszerűen nincsenek tervezők és prototípusok (minden esetben a programozó nem éri el őket).

Más böngészőkben jobbak. A tervezők, és meghatározhatja az értékosztályt. Ezeket csak különböző böngészőkben hívják különböző módon. Például a Htmlcollection esetében a tervező htmlcollection vagy nodelist, vagy akár nodelistconstructor.

Meg kell határoznia az alaptervezőt a Dombementhez. Az FF-ben, ez például a htmlement, amelyből htmlessivement és mások már örököltek.

A Firefox a Firefoxba kerül a 10. verzió és az Opera alatt 11 alatt. Van egy gyűjtemény konstruktor - objektum.

konstruktor.name.

Több konstruktornak van olyan neve, amely hasznos lehet.

Tartalmazza a tervező funkció nevét, például (5) .constructor.name \u003d\u003d\u003d "szám".

De:
1. Az IE-ben még a 9. sem is.
2. A fogadó tárgyakban a böngészőket újra megint nyomják (és gyakran nem rendelkeznek ilyen tulajdonsággal). Az Opera-ban a Domeletement a tervező neve általában.prototípus.
3. Az érvek ismét "objektum".

következtetések

A bemutatott módszerek egyike sem ad 100 százalékos definíciót az érték / osztály értékét minden böngészőben. Azonban az összesített, amit megengednek.

A közeljövőben megpróbálom összegyűjteni az összes adatot a jelekbe, és példát mutat a definíció funkcióra.



Tetszett a cikket? Oszd meg