JavaScript, tüüp, tüübid ja klassid. Dünaamiline tüübituvastus Ajutiste surnud tsoonidega seotud vead

Dünaamiline tüübituvastus

Dünaamiline tüübituvastus (RTTI) võimaldab teil käitusajal määrata objekti tüübi. See osutub kasulikuks mitmel põhjusel. Eelkõige saate põhiklassile viidates üsna täpselt määrata selle viitega juurdepääsetava objekti tüübi. Dünaamiline tüübituvastus võimaldab ka eelnevalt kontrollida, kui edukas on tüübivalamise tulemus, vältides ebaõigest tüübivalamisest tulenevat erandit. Lisaks on dünaamiline tüübituvastus peegelduse põhikomponent.

Dünaamilise tüübituvastuse toetamiseks pakub C# kolme märksõnad a: is, as ja typeof. Kõiki neid märksõnu käsitletakse omakorda edasi.

on operaator

Objekti konkreetse tüübi saab määrata operaatori is abil. Allpool on selle üldine vorm:

väljend on tüüp

kus avaldis tähistab ühte avaldist, mis kirjeldab objekti, mille tüüpi testitakse. Kui avaldis on testitava tüübiga ühilduvat või sama tüüpi, on selle toimingu tulemus tõene, vastasel juhul on see väär. Seega on tulemus tõene, kui avaldis on ühel või teisel kujul testitavat tüüpi. Operaatoris is määratletakse mõlemad tüübid ühilduvatena, kui need on sama tüüpi või kui on ette nähtud viite teisendamine, kastimine või lahtipakkimine.

Järgmine on operaatori is kasutamise näide:

Süsteemi kasutamine; nimeruum ConsoleApplication1 ( klass Lisa ( ) klass Sum: Lisa ( ) klass Programm ( staatiline void Main() ( Add a = new Add(); Sum s = new Sum(); if (a on Add) Console.WriteLine("Muutuja a on tüüpi Add"); if (s on summa) Console.WriteLine("Muutuja s tüüp on päritud klassist Add"); Console.ReadLine(); ) ) )

operaatorina

Mõnikord tuleb tüübiteisendus teha tööajal, kuid mitte teha erandit, kui teisendamine ebaõnnestub, mis on tüübivalimise korral täiesti võimalik. Operaator as täidab seda eesmärki ja sellel on järgmine üldvorm:

väljendus tüübina

kus avaldis tähistab ühte avaldist, mis on teisendatav määratud tüübiks.

Kui sellise teisenduse tulemus on edukas, tagastatakse viide tüübile, vastasel juhul nullviide. Operaatorit as saab kasutada ainult viite teisendamiseks, identiteediks, kastimiseks, lahtipakkimiseks. Mõnel juhul võib as-operaator olla mugav alternatiiv is-operaatorile. Näiteks kaaluge järgmist programmi:

Süsteemi kasutamine; nimeruum ConsoleApplication1 ( klass Lisa ( ) klass Sum: Lisa ( ) klass Programm ( staatiline void Main() ( Add a = new Add(); Sum s = new Sum(); // Sooritage cast a = s nagu Add; if ( a != null) Console.WriteLine("Konversioon õnnestus"); else Console.WriteLine("Viga teisendamisel"); Console.ReadLine(); ) ) )

Selle programmi käivitamise tulemus on edukas teisendus.

JavaScript või JS(varsti) pole lihtne keel ja algajad arendajad ei õpi sellest kohe. Alguses õpitakse põhitõdesid ja kõik tundub värviline ja ilus. Natuke sügavamale minnes on JavaScripti massiivid, objektid, tagasihelistamised ja kõik muu, mis tihtipeale pähe ajab.

JavaScriptis on oluline muutuja tüüpi õigesti kontrollida. Oletame, et soovite teada, kas massiivi muutuja või objekt? Kuidas seda õigesti kontrollida? Sel konkreetsel juhul on kontrollimise ajal nippe ja sellest see postitus räägibki. Alustame kohe.

Muutuja tüübi kontrollimine

Näiteks peate kontrollima, kas muutuja on objekt, massiiv, string või arv. Selle jaoks saate kasutada typeof, kuid see ei ütle teile alati tõtt ja ma näitan teile, miks allolevas näites.

Kirjutasin selle näite, et illustreerida, miks tüüp ei ole alati õige valik.

Var _comparison = ( string: "string", int: 99, float: 13.555, objekt: (tere: "tere"), array: new Array(1, 2, 3) ); // Tagastab massiivi objekti võtmetega var _objKeys = Objekti võtmed(_võrdlus); for(var i = 0; i<= _objKeys.length - 1; i++) { // выведем в консоль тип каждой переменной console.log(typeof _comparson[_objKeys[i]]); }

Koodi täitmise tulemus:

String number objekti objekt

eks? - Muidugi mitte. Probleeme on kaks. Kõiki neist kirjeldatakse üksikasjalikult ja pakutakse välja lahendus.

Esimene probleem: ujukarv, väljund numbrina

Comparison.float ei ole arv ja see peab olema numbri asemel ujuk. Selle parandamiseks saate luua funktsiooni, millel on märk allolevas koodis.

Var_floatArv = 9,22; var_notFloatNumber = 9; konsool.log(isFloat(_floatNumber)); console.log(isFloat(_notFloatNumber)); console.log(isFloat("")); funktsioon isFloat(n)( return Number(n) === n && n % 1 !== 0; )

Funktsioon isFloat() kontrollib kõiki ujukomaarvude väärtusi. Kõigepealt kontrollige, kas muutuja on võrdne n arv (Number(n) === n) ja kui jah, siis tehakse veel üks kontroll jäägiga jagamiseks ja kui jääk on, siis tagastatakse tõeväärtus ( tõsi või vale) tulemus (n % 1 !== 0).

Ülaltoodud näites naaseb see tõsi, vale ja vale. Esimene tähendus on ujuk tüüp, teine ​​ei ole - see on tavaline arv ja viimane on lihtsalt tühi string, mis ei vasta reeglitele.

Teine probleem: massiiv määratleti objektina

Kõige esimeses näites renderdatakse massiiv objektina, mis pole kuigi hea, sest vahel on vaja seda tüüpi kasutada ja mitte midagi muud.

Massiivitüübi muutuja testimiseks on mitu võimalust.

Esimene variant (hea variant). Kontrollige, kas andmed kuuluvad massiivi, kasutades instanceof().

Var data = new Array("tere", "maailm"); var isArr = massiivi andmeeksemplar;

Teine variant (hea variant). Meetod Array.isArray() tagastab tõeväärtuse, mis sõltub sellest, kas muutuja on massiiv või mitte ().

Var data = new Array("tere", "maailm"); var isArr = Massiiv.isArray(andmed);

Kolmas variant (parim, aga pikk). Mugavuse huvides saate selle meetodi funktsiooniks muuta. Kasutades objekti teeme . Kui objekti Object.prototype.toString.call(data) tulemus ei ole võrdne, ei ole muutuja massiiv ().

Var data = new Array("tere", "maailm"); var isArr = Object.prototype.toString.call(data) == ""; console.log(isArr);

Viimane tulemus mugavusfunktsioonina:

Funktsioon isArray(data) (tagasi Object.prototype.toString.call(data) == "" )

Nüüd saate kutsuda funktsioone isArray() ja seada argumendiks massiivi või midagi ning tulemust näha.

Järelsõna

Plaat osutus päris mahukaks, kui algselt mõeldud oli. Kuid ma olen sellega rahul, sest see on piisavalt lühike ja selge, et kirjeldada JavaScripti muutujate valideerimise raskusi ja nendest möödahiilimist.

Kui teil on küsimusi, postitage need selle postituse alla. Aitan hea meelega.

a = (b > 0) && (c + 1 != d); lipp = !(olek = 0);

Tabel 14.5. Loogilised operaatorid

Operaatori kirjeldus

! EI (loogiline inversioon)

&& JA (tõve korrutis)

|| VÕI (loogiline lisamine)

Tabel 14.6. AND- ja OR-operaatorite käivitamise tulemused

Operand 1

Operand 2

Tabel 14.7. NOT-lause täitmise tulemused

hankige operaatori tüüp

Hangi tüübioperaator typeof tagastab stringi, mis kirjeldab operandi andmetüüpi. Operaand, mille tüüp tuleb leida, asetatakse selle operaatori järele ja sulgudes:

s = typeof("str");

Selle avaldise tulemusena sisaldab muutuja s stringi "string" , mis tähistab stringi tüüpi.

Kõik väärtused, mida operaatori tüüp saab tagastada, on loetletud tabelis 1. 14.8.

Tabel 14.8. Väärtused, mille on tagastanud operaatori tüüp

Andmetüüp

Tagastusstring

String

Numbriline

Tabel 14.8 (lõpp)

Andmetüüp

Tagastusstring

Loogiline

Ühilduvus ja andmetüübi teisendamine

On aeg mõelda veel kahele olulisele küsimusele: andmetüüpide ühilduvus ja ühelt tüübilt teisele teisendamine.

Mis juhtub, kui liidate kaks numbrit kokku? Täpselt nii – veel üks arvväärtus. Mis siis, kui lisate numbri ja stringi? Raske öelda... Siin puutub JavaScript kokku andmetüüpide ühildamatuse probleemiga ja proovib need tüübid ühilduvaks muuta, teisendades ühe neist teiseks. Esmalt proovib see stringi arvuks teisendada ja kui see õnnestub, siis lisab. Kui see ei õnnestu, teisendatakse arv stringiks ja kaks saadud stringi aheldatakse. Näiteks loendis 14-6 olev veebiskript teisendab muutujale a lisamisel muutuja b väärtuse numbriliseks tüübiks; seega sisaldab muutuja c väärtust 23.

Nimekiri 14.6

var a, b, c, d, e, f; a = 11;

b = "12"; c = a + b;

d="JavaScript"; e = 2;

Kuid kuna muutuja d väärtust ei saa arvuks teisendada, teisendatakse e väärtus stringiks ja tulemus - f väärtus - võrdub

Tõeväärtused teisendatakse vastavalt vajadusele kas numbrilisteks või stringiväärtusteks. Tõene teisendatakse arvuks 1 või stringiks "1" ja Väär väärtuseks 0 või "0" . Ja vastupidi, arv 1 teisendatakse tõeseks ja arv 0 vääraks. Samuti teisendatakse false

me oleme tühised ja määratlemata .

III osa. Veebilehe käitumine. Veebiskriptid

On näha, et JavaScriptil on raskusi isegi valesti kirjutatud väljendite korrektse täitmisega. Mõnikord see toimib, kuid sagedamini ei lähe kõik plaanipäraselt ja lõpuks katkeb veebiskript, kuna skripti täiesti teises kohas, täiesti õigel väitel leitakse viga. Seetõttu on parem selliseid juhtumeid vältida.

Operaatori eelistus

Viimane probleem, mida siin käsitleme, on operaatori prioriteet. Nagu mäletame, mõjutab ülimuslikkus avaldise operaatorite täitmise järjekorda.

Olgu siin järgmine väljend:

Sel juhul liidetakse esmalt muutuja b väärtusele c väärtus ja seejärel lahutatakse summast 10. Selle avaldise operaatoritel on sama prioriteet ja seetõttu täidetakse neid rangelt vasakult paremale.

Nüüd kaaluge seda väljendit:

Siin korrutatakse kõigepealt väärtus c 10-ga ja alles siis lisatakse saadud korrutisele väärtus b. Korrutustehter on kõrgem kui liitmistehter, seega rikutakse järjekorda "rangelt vasakult paremale".

Määramise operaatoritel on madalaim prioriteet. Seetõttu hinnatakse kõigepealt avaldist ennast ja seejärel määratakse selle tulemus muutujale.

V Üldiselt on kõigi lausete täitmise põhiprintsiip järgmine: esiteks laused, millel on rohkem kui kõrge prioriteet, ja alles siis - operaatorid madalamaga. Sama tähtsusega operaatorid täidetakse nende ilmumise järjekorras (vasakult paremale).

V sakk. 14.9 loetleb kõik meie uuritud operaatorid nende tähtsuse kahanevas järjekorras.

Tabel 14.9. Operaatori prioriteetsus (kahanevas järjekorras)

Operaatorid

Kirjeldus

++ -- - ~ ! tüüp

Suurendamine, vähendamine, märgi muutmine, loogiline EI, tüübi järeldus

Korrutamine, jagamine, jääk

Stringide liitmine ja ühendamine, lahutamine

Võrdlusoperaatorid

loogiline JA

Peatükk 14. Sissejuhatus veebiprogrammeerimisse. JavaScripti keel

Tabel 14.9 (lõpp)

Operaatorid

Kirjeldus

Loogiline VÕI

Tingimuslik operaator (vt allpool)

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

Ülesanne, lihtne ja keeruline

TÄHELEPANU!

Pidage meeles seda tabelit. Lausete vale täitmise järjekord võib põhjustada raskesti tuvastatavaid vigu, mille puhul näiliselt absoluutselt õige avaldis annab vale tulemuse.

Aga mis siis, kui meil on vaja rikkuda avalduste tavalist täitmise järjekorda? Kasutame sulgusid. Selles tähistuses täidetakse kõigepealt sulgudes olevad avaldused:

a = (b + c) * 10;

Siin liidetakse kõigepealt muutujate b ja c väärtused ning seejärel korrutatakse saadud summa 10-ga.

Sulgudes olevad operaatorid on samuti ülimuslikud. Seetõttu kasutatakse sageli mitut pesastatud sulgu:

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

Siin täidetakse avaldused järgmises järjekorras:

1. Lisage b ja c.

2. Korrutage saadud summa 10-ga.

3. Korrutisest d lahutamine.

4. Jagage vahe 2-ga.

5. Jagatisele 9 liitmine.

Kui eemaldate sulgud:

a = b + c * 10 - d/2 + 9;

siis on operaatorite täitmise järjekord järgmine:

1. Korrutage c ja 10.

2. Jagage d 2-ga.

3. B liitmine ning c ja 10 korrutamine.

4. Jagamise jagatise saadud summast lahutamine d kuni 2.

5. Lisades saadud erinevusele 9.

Selgub, et tulemus on täiesti erinev, eks?

  • määramata: "määratlemata"
  • Null: "objekt"
  • Boolean: "tõve"
  • Number: "number"
  • String: "string"
  • Funktsioon: "funktsioon"
  • Kõik muu: "objekt"

Sellesse tabelisse tuleks lisada järgmised märkused:

1. typeof null === "objekt" .

Teoreetiliselt on siin peen point. Staatiliselt trükitud keeltes ei tohi objektitüübi muutuja objekti sisaldada (NULL, nil, null pointer).

Praktiliselt – JavaScriptis on see ebamugav. Nii et ES 5.1 arendajad teevad midagi intuitiivsemat: typeof null === "null" .

Kuid kuna oleme endiselt ES3 ümber, ärge tehke viga näiteks selles:

/* Funktsioon otsib mingit objekti ja tagastab selle või nulli, kui midagi ei leitud */ funktsioon otsing() () var obj = otsing(); if (objekti tüüp === "objekt") ( // kas me tõesti leidsime objekti (FAIL) obj.method(); )

2. Ärge unustage ümbrisobjekte (typeof new Number(5) === "objekt").

3. Ja ärge unustage brauserite õigust host-objektidega midagi ette võtta.

Ärge imestage, et Safari käsitleb kangekaelselt HTMLCollectionit funktsioonitüübina ja 9. eelne IE säilitab meie lemmikfunktsiooni Alert() objektina . Samuti pidas Chrome varem RegExpi funktsiooniks, kuid nüüd tundub, et see tuleb mõistusele ja vastab sellele objektiga.

toString()

Püüdes selle meetodi toString() tulemusest väärtuse tüüpi välja selgitada on mõttetu. Kõikides "klassides" määratletakse see meetod uuesti omaks.

Meetod on hea silumisinfo kuvamiseks, kuid muutuja tüüpi ei saa selle järgi määrata.

Object.prototype.toString()

Kuigi konkreetsetes "klassides" on toString üle kirjutatud, on meil siiski selle esialgne rakendus Objectist. Proovime seda kasutada:

console.log ( Object .prototype .toString .call (väärtus) ) ;

console.log(Object.prototype.toString.call(value));


Clinton lahjendab seda koormat

Kummalisel kombel töötab see meetod üllatavalt hästi.

Sest skalaarsed tüübid tagastab , , , .

Naljakas on see, et isegi uus Number(5), mille tüüp siin ebaõnnestus, tagastab .

Nulli ja määramata korral meetod ebaõnnestub. Erinevad brauserid tagastavad kas oodatud ja , või või isegi . Kuid ilma selleta on nende kahe väärtuse tüüpi lihtne kindlaks teha.

Huvitavad asjad saavad alguse siis, kui jõuame objektideni (need, mille tüüp on === "objekt").

sisseehitatud objektid töötavad praktiliselt pauguga:

  • {} —
  • kuupäev-
  • viga-
  • regexp-

Ainus asi, mis argumentide loendist välja langeb, on kas , või .
Host-objektide puhul on kõik jälle hullem.

IE-s hakkasid DOM-objektid "tavalisteks" objektideks saama alles 8. versioonist ja siis mitte päris lõpuni. Seetõttu kantakse IE 6-8 puhul kõik need objektid (HTMLCOllection, DOMElement, TextNode, aga ka dokument ja aken) lihtsalt üle .

Kõigis teistes brauserites (sh IE9) saab toString tulemusega juba midagi ette võtta. Kuigi kõik pole samuti lihtne: HTMLCollection seal , siis . aken - siis , siis , siis . Kuid võite juba proovida sellest midagi saada.

DOMElementiga on see keerulisem: see kuvatakse iga sildi jaoks erineva vorminguna. Aga siin aitab meid tavahooaeg.

Teiste hostobjektidega (asukoha ja navigaatori testides) on lugu umbes sama. Kõikjal, välja arvatud IE, saab neid identifitseerida stringi järgi.

Object.prototype.toString() kasutamise miinustest:

1. See võimalus ei ole standardiga pühitsetud. Ja me peaksime siin pigem rõõmustama, et kõik nii hästi toimib, mitte hädaldama mõne vea pärast.

2. Tüübi määramine stringi parsimise teel, mis on tagastatud meetodi abil, mis ei ole sugugi tüübi määramiseks, ja kutsutakse isegi objektile, mille kohta see ei kehti, jätab hinge veidi setteid.

3. Nagu näete, ei tuvastata vanas IE-s tavaliselt hostobjekte.

Siiski on see üsna töötav asi, kui seda kasutada koos teiste tööriistadega.


Konstruktorid

Ja lõpuks konstruktorid. Kes oskaks JS-is objekti "klassi" kohta paremini öelda kui selle konstruktor?

nullil ja undefinedil pole ümbrisobjekte ega konstruktoreid.

Ülejäänud skalaaritüüpidel on ümbrised, nii et saate konstruktori:

(5) .konstruktor === Arv ; (Arv .NaN ) .konstruktor === Arv ; (tõene ) .constructor === Boolean ; ("string") .constructor === String ;

(5).konstruktor === Arv; (Arv.NaN).konstruktor === Arv; (tõene).konstruktor === Boolean; ("string").konstruktor === String;

Kuid näide siin ei tööta:

5 instanceofNumber ; // false Number .NaN instanceof Number ; // Boole'i ​​vale tõene eksemplar ; // String vale "string" eksemplar ; // vale

5 instanceofNumber; // vale Number.NaN instanceof Number; // Boole'i ​​vale tõene eksemplar; // vale "string" eksemplar String; // vale

(näiteks töötab kauakannatanud uue numbri jaoks(5))

Funktsioonidega (mis on ka objektid) teeb instanceof järgmist:

konsool. logi ( (funktsioon () ( ) ) Funktsiooni eksemplar ) ; // tõene konsool. logi ( (funktsioon () ( ) ) .konstruktor === Funktsioon ); // tõsi

console.log((funktsioon () ()) Funktsiooni eksemplar); // tõene konsool.log((funktsioon () ()).konstruktor === Funktsioon); // tõsi

Kõik sisseehitatud klasside objektid on hõlpsasti tuvastatavad ka konstruktorite poolt: Array , Date , RegExp , Error .

Üks probleem tekib siin argumentidega, mille konstruktoriks on objekt.

Ja teine ​​objekti endaga või õigemini, kuidas viidata sellele kohandatud konstruktori kaudu loodud objektile.

Ainult põhiobjekti saab määratleda järgmiselt:

obj instanceofObject;

Ühe määratlusvalikuna itereerige üle kõik muud võimalikud tüübid (Array , Error ...) ja kui ükski neist ei kuulu - "objekt".

Konstruktorid ja hostobjektid

Hostobjektidega läheb asi hullemaks.

Alustame sellest, et IE kuni 7. versioonini (kaasa arvatud) ei pea neid üldse normaalseteks objektideks. Neil lihtsalt ei ole seal konstruktoreid ja prototüüpe (igatahes ei saa programmeerija neile ligi).

Teistes brauserites on asjad paremini. Konstruktorid on olemas ja nende järgi saab määrata väärtusklassi. Ainult neid nimetatakse erinevates brauserites erinevalt. Näiteks HTMLCollectioni puhul on konstruktor kas HTMLCollection või NodeList või isegi NodeListConstructor .

Samuti peaksite määratlema DOMElementi baaskonstruktori. FF-is on selleks näiteks HTMLElement , millest HTMLDivElement ja teised juba pärivad.

Triki viskab FireFox alla versiooni 10 ja Opera alla versiooni 11. Seal on kogu konstrueerijaks Object .

konstruktor.nimi

Konstruktoril on ka nimiomadus, mis võib olla kasulik.

See sisaldab konstruktorifunktsiooni nime, näiteks (5).constructor.name === "Arv" .

Aga:
1. IE-s pole seda üldse, isegi 9.-s.
2. Host-objektides vormivad brauserid jälle kõike, mis on palju (ja sageli pole neil seda omadust üldse). Operas on DOMElementil konstruktori nimi Function.prototype .
3. argumendid jälle "objekt".

järeldused

Ükski esitatud meetoditest ei anna kõigis brauserites väärtuse tüübi / klassi 100% määratlust. Kuid koos võimaldavad need teil seda teha.

Lähiajal püüan kõik andmed tabelitesse koguda ja tuua näite defineeriva funktsiooni kohta.

Operaator tüüp tagastab stringi, mis näitab operandi tüüpi.

Süntaks

Operand järgib operaatori tüüpi:

tüüp operand

Parameetrid

operand on avaldis, mis esindab objekti või primitiivi, mille tüüp tagastatakse.

Kirjeldus

Järgmises tabelis on loetletud tüübi võimalikud tagastusväärtused. Lisainformatsioon tüüpide ja primitiivide kohta on lehel.

Näited

// Numbers typeof 37 === "number"; typeof 3.14 === "arv"; typeof(42) === "arv"; typeof Math.LN2 === "arv"; typeof Infinity === "arv"; tüüp NaN === "arv"; // kuigi see on "Not-A-Number" tüüpi Number(1) === "number"; // ära kasuta seda tähistust! // Stringi tüüp "" === "string"; "bla" tüüp === "string"; tüüp "1" === "string"; // pane tähele, et stringi sees olev arv on endiselt tüüpi string typeof (typeof 1) === "string"; // typeof tagastab sel juhul alati stringi typeof String("abc") === "string"; // ära kasuta seda tähistust! // Booleans typeof true === "tõve"; typeof false === "tõve"; Boolean(tõene) === "tõeväärtus"; // ära kasuta seda tähistust! // Symbols typeof Symbol() === "symbol" typeof Symbol("foo") === "symbol" typeof Symbol.iterator === "symbol" // Undefined typeof undefined === "määratlemata"; typeof deklareeritudButUndefinedVariable === "määratlemata"; typeof undeclaredVariable === "määratlemata"; // Objektide tüüpof(a: 1) === "objekt"; // kasutage Array.isArray või Object.prototype.toString.call // tavaobjektide ja massiivide eristamiseks === "objekt"; typeof new Date() === "objekt"; // Kõik allpool olevad asjad põhjustavad vigu ja probleeme. Ära kasuta! typeof new Boolean(true) === "objekt"; typeof new Number(1) === "objekt"; typeof new String("abc") === "objekt"; // Funktsioonid typeof function() () === "funktsioon"; klassi tüüp C() === "funktsioon"; typeof Math.sin === "funktsioon";

null

// Seda on defineeritud alates JavaScripti typeof null === "object" sünnist;

JavaScripti esimeses juurutamises tähistati väärtusi sildi tüübi ja väärtuste paariga. Objektide sildi tüüp oli 0. null esitati null-osutajana (enamikul platvormidel 0x00). Seetõttu oli null sildi tüüp null, seega on typeof tagastusväärtus võlts. ()

ECMAScriptis on pakutud parandus (keelamise kaudu), kuid see lükati tagasi. Selle tulemuseks oleks typeof null === "null" .

Uue operaatori kasutamine

// Kõik "new"-ga loodud konstruktorifunktsioonid on tüüpi "object" var str = new String("String"); var num = new Number(100); typeofstr; // Tagastab "objekti" typeof num; // Tagastab "objekti" // Funktsiooni konstruktori puhul on aga erand var func = new Function(); funktsiooni tüüp; // Tagastab "funktsiooni"

Regulaaravaldised

Nimetatud regulaaravaldised olid mõnes brauseris ebastandardsed lisad.

Tüüp /s/ === "funktsioon"; // Chrome 1-12 Ei ühildu ECMAScript 5.1-ga /s/ === "objekt"; // Firefox 5+ Ühildub ECMAScript 5.1-ga

Ajutiste surnud tsoonidega seotud vead

Enne ECMAScript 2015 tagati, et operaatori tüüp tagastab stringi mis tahes operandi jaoks, millega seda kutsuti. See muutus, kui lisandusid mittetõstevad ploki ulatusega let ja const deklaratsioonid. Nüüd, kui muutujad on deklareeritud parameetritega let ja const ning typeof kutsutakse neile muutuja deklaratsiooniplokis, kuid enne deklaratsiooni, siis visatakse välja ReferenceError. Käitumine erineb deklareerimata muutujatest, mille tüüp tagastab "määratlemata". Ploki ulatusega muutujad on "ajutises surnud tsoonis", mis kestab ploki algusest kuni muutujate deklareerimise hetkeni. Selles tsoonis loob muutujatele juurdepääsu katse erandi.

Typeof undeclaredVariable === "määratlemata"; typeof newLetVariable; let newLetVariable; // ReferenceError typeof newConstVariable; const newConstVariable = "tere"; // ReferenceError

Erandid

Kõigis praegustes brauserites on mittestandardne document.all hostobjekt, mille tüüp on Undefined.

Dokumendi tüüp.all === "määratlemata";

Kuigi spetsifikatsioon lubab mittestandardsete eksootiliste objektide jaoks kohandatud tüübinimesid, peavad need nimed eeldefineeritud nimedest erinema. Olukorda, kus document.all on tüüpi undefined, tuleks lugeda erandlikuks reeglite rikkumiseks.

Tehnilised andmed

Spetsifikatsioon Olek Kommentaarid
ECMAScripti uusim mustand (ECMA-262)
Mustand
ECMAScript 2015 (6. väljaanne, ECMA-262)
"Operaatori tüübi" määratlus selles spetsifikatsioonis.
Standard
ECMAScript 5.1 (ECMA-262)
"Operaatori tüübi" määratlus selles spetsifikatsioonis.
Standard
ECMAScript 3rd Edition (ECMA-262)
"Operaatori tüübi" määratlus selles spetsifikatsioonis.
Standard
ECMAScript 1. väljaanne (ECMA-262)
"Operaatori tüübi" määratlus selles spetsifikatsioonis.
Standard Esialgne määratlus. Rakendatud JavaScriptis 1.1

Brauseri ühilduvus

Värskendage GitHubi ühilduvusandmeid

ArvutidMobiilneserver
ChromeservFirefoxInternet ExplorerOopersafariandroid veebivaadeChrome AndroidileFirefox AndroidileOpera AndroidileSafari iOS-isSamsungi InternetNode.js
tüüpChrome Täielik tugi 1 serv Täielik tugi 12 Firefox Täielik tugi 1 IE Täielik tugi 3 Ooper Täielik tugi Jahsafari Täielik tugi Jahveebivaade android Täielik tugi 1 Chrome Android Täielik tugi 18 Firefox Android Täielik tugi 4 OperaAndroid Täielik tugi JahSafari iOS Täielik tugi JahSamsung Internet Android Täielik tugi 1.0 nodejs Täielik tugi Jah

Legend

Täielik tugi Täielik tugi

IE-spetsiifilised märkused

IE 6, 7 ja 8 puhul on paljud hostobjektid objektid, mitte funktsioonid. Näiteks.