JavaScript, typeof, vrste i klase. Identifikacija dinamičkog tipa Greške povezane s privremenim mrtvim zonama

Dinamička identifikacija tipa

Dinamička identifikacija tipa (RTTI) omogućuje vam da odredite vrstu objekta u vrijeme izvođenja. Pokazalo se da je korisno iz raznih razloga. Konkretno, pozivanjem na osnovnu klasu možete prilično precizno odrediti vrstu objekta dostupnog na ovoj vezi. Dinamička identifikacija tipa također vam omogućava da unaprijed provjerite koliko će uspješno biti u tijeku typecast, sprječavajući nevažeći izuzetak typecast -a. Osim toga, identifikacija dinamičkog tipa glavna je komponenta refleksije.

Da bi podržao identifikaciju dinamičkog tipa, C # nudi tri ključne riječi: is, as i typeof. Svaka od ovih ključnih riječi se redom raspravlja u nastavku.

Je operater

Određena vrsta objekta može se odrediti pomoću operatora is. Njegov opći oblik prikazan je u nastavku:

izraz je tip

gdje izraz označava zaseban izraz koji opisuje objekt čiji se tip provjerava. Ako je izraz kompatibilnog tipa ili istog tipa kao tip koji se testira, tada je rezultat ove operacije istinit, u suprotnom je netačan. Dakle, rezultat je istinit ako izraz ima tip koji se može testirati u jednom ili drugom obliku. Operater is definira oba tipa kao kompatibilna ako su istog tipa ili ako je predviđena referentna konverzija, boks ili raspakiranje.

Ispod je primjer korištenja operatora is:

Using System; imenski prostor ConsoleApplication1 (klasa Add () klasa Sum: Add () klasa Program (static void Main () (Add a = new Add (); Sum s = new Sum (); if (a je Add) Console.WriteLine ("Varijabla a je tipa Add "); if (s je Sum) Console.WriteLine (" Tip s je naslijeđen od klase Add "); Console.ReadLine ();)))

Kao operater

Ponekad je potrebno pretvorbu tipa izvršiti za vrijeme izvođenja, ali ne bacati iznimku ako konverzija ne uspije, što je sasvim moguće s lijevanjem tipova. U tu svrhu služi operator as koji ima sljedeći opći oblik:

izraz kao tip

gdje izraz označava jedan izraz koji treba pretvoriti u navedeni tip.

Ako ova konverzija uspije, vraća se referenca na tip; u suprotnom, prazna referenca. Operater as može se koristiti samo za konverziju referenci, identitet, boks, raspakiranje. U nekim slučajevima, operator as može poslužiti kao prikladna alternativa operatoru is. Kao primjer, razmotrite sljedeći program:

Using System; imenski prostor ConsoleApplication1 (klasa Add () klasa Sum: Add () klasa Program (static void Main () (Add a = new Add (); Sum s = new Sum (); // Izvođenje unosa a = s kao Add; if ( a! = null) Console.WriteLine ("Konverzija je uspjela"); else Console.WriteLine ("Konverzija nije uspjela"); Console.ReadLine ();)))

Rezultat ovog programa bit će uspješna konverzija.

JavaScript ili Js(skraćeno) nije lak jezik i programeri početnici ne saznaju odmah o tome. U početku uče osnove i sve izgleda šareno i lijepo. Ako idemo malo dublje, pojavljuju se JavaScript nizovi, objekti, povratni pozivi i slično, koje mozak često uklanja.

U JavaScriptu je važno ispravno provjeriti tip varijable. Recimo da želite znati je li varijabla niz ili objekt? Kako to ispravno proveriti? U ovom konkretnom slučaju postoje trikovi tokom provjere i o tome će biti riječi u ovom unosu. Počnimo odmah.

Provjera tipa varijable

Na primjer, morate provjeriti je li varijabla objekt, niz, niz ili broj. Za to možete koristiti typeof, ali on neće uvijek dati istinu, pa ću u donjem primjeru pokazati zašto.

Napisao sam ovaj primjer kako bih ilustrirao zašto typeof nije uvijek pravi izbor.

Var _ poređenje = (niz: "string", int: 99, float: 13.555, objekt: (zdravo: "zdravo"), niz: novi niz (1, 2, 3)); // Vraća niz sa objektnim ključevima var _objKeys = Object.keys (_comparison); za (var i = 0; i<= _objKeys.length - 1; i++) { // выведем в консоль тип каждой переменной console.log(typeof _comparson[_objKeys[i]]); }

Rezultat izvršavanja koda:

Broj objekta broj objekta objekt

Tačno? - Naravno da ne. Postoje dva problema. Svaki od njih bit će detaljno opisan i predloženo rješenje.

Prvi problem: float broj, izlaz kao broj

Comparison.float nije broj i trebao bi biti plutajući umjesto broja.Da biste to popravili, možete stvoriti funkciju s provjerom valjanosti kao u donjem kodu.

Var _floatNumber = 9.22; var _notFloatNumber = 9; console.log (isFloat (_floatNumber)); console.log (isFloat (_notFloatNumber)); console.log (isFloat ("")); funkcija isFloat (n) (vraća broj (n) === n && n% 1! == 0;)

Funkcija isFloat () provjerava sve vrijednosti za brojeve s pomičnim zarezom. Prvo provjerava je li varijabla jednaka n number (Number (n) === n) i ako je tako, vrši se još jedna provjera podjele sa ostatkom, a ako postoji ostatak, tada se boolean ( istinito ili false) rezultat (n% 1! == 0).

U gornjem primjeru se vraća istinito, false i false... Prvo značenje je plutati tip, drugi nije - ovo je običan broj, a zadnji je samo prazan niz koji ne odgovara pravilima.

Drugi problem: niz je definiran kao objekt

U prvom primjeru niz je prikazan kao objekt i to nije baš dobro, jer ponekad morate koristiti ovaj određeni tip i ništa drugo.

Postoji nekoliko načina za testiranje varijable za tip niza.

Prva opcija (dobra opcija). Provjeravamo pripadaju li podaci nizu pomoću instanceof ().

Var data = new Array ("zdravo", "svijet"); var isArr = instanca podataka niza;

Druga opcija (dobra opcija). Metoda Array.isArray () vraća logičku vrijednost, koja će ovisiti o tome je li varijabla niz ili nije ().

Var data = new Array ("zdravo", "svijet"); var isArr = Array.isArray (podaci);

Treća opcija (najbolja, ali najduža). Radi praktičnosti, ovu funkciju možete postaviti. Koristeći Object, to činimo. Ako rezultat Object.prototype.toString.call (data) nije jednak onda varijabla nije niz ().

Var data = new Array ("zdravo", "svijet"); var isArr = Object.prototype.toString.call (podaci) == ""; console.log (isArr);

Posljednji rezultat kao funkcija pogodnosti:

Funkcija isArray (data) (vraćanje Object.prototype.toString.call (data) == "")

Sada možete pozvati funkciju isArray () i postaviti niz ili nešto drugo kao argument i vidjeti rezultat.

Pogovor

Pokazalo se da je snimak dovoljno velik nego što je prvotno bilo predviđeno. Ali zadovoljan sam s njim, jer kratko i jasno opisuje poteškoće u provjeri varijabli u JavaScript -u i kako ih zaobići.

Ako imate još pitanja - napišite ih ispod ovog unosa. Rado ću vam pomoći.

a = (b> 0) && (c + 1! = d); zastavica =! (status = 0);

Tabela 14.5. Logički operatori

Opis operatora

! NOT (logička inverzija)

&& AND (logičko množenje)

|| ILI (logički dodatak)

Tabela 14.6. Rezultati izvršavanja operatora AND i OR

Operand 1

Operand 2

Tabela 14.7. Rezultati NOT izjave

Nabavite operator typeof

Nabavite operatora tipa typeof vraća niz koji opisuje tip podataka operanda. Operand čiji tip želite znati je smješten iza ovog operatora i zatvoren u zagrade:

s = typeof ("str");

Kao rezultat ovog izraza, varijabla s sadržavat će niz "string" koji označava vrstu niza.

Sve vrijednosti koje operator typeof može vratiti navedene su u tablici. 14.8.

Tabela 14.8. Vrijednosti koje vraća operator typeof

Tip podataka

Vraćen niz

String

Numerički

Tabela 14.8 (kraj)

Tip podataka

Vraćen niz

Logično

Kompatibilnost i pretvorba tipova podataka

Sada je trenutak da razmotrimo još dva važna pitanja: kompatibilnost tipa podataka i konverziju iz jedne vrste u drugu.

Šta se događa kada dodate dva broja? Tako je - još jedna numerička vrijednost. A ako dodate broj i niz? Teško je reći ... Ovdje se JavaScript suočava s problemom nekompatibilnosti tipova podataka i pokušava ih učiniti kompatibilnima pretvaranjem jednog u drugi. Prvo pokušava pretvoriti niz u broj, a ako uspije, vrši sabiranje. Ako ne uspije, broj će se pretvoriti u niz, a dva rezultirajuća niza će se spojiti. Na primjer, izvršavanje web skripte u Popisu 14.6 pretvara vrijednost b u numerički tip kada se doda u a; stoga će varijabla c sadržavati vrijednost 23.

Lista 14.6

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

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

d = "JavaScript"; e = 2;

No, budući da se vrijednost d ne može pretvoriti u broj, vrijednost e će se pretvoriti u niz, a rezultat - vrijednost f - postat će

Logičke vrijednosti se prema potrebi pretvaraju u numeričke ili string vrijednosti. Tačno će se pretvoriti u broj 1 ili niz "1", a netočno će se pretvoriti u 0 ili "0". Nasuprot tome, broj 1 će se pretvoriti u true, a broj 0 u false. Takođe, lažno će se pretvoriti

vrijednosti su null i undefined.

Dio III. Ponašanje web stranica. Web skripte

Može se vidjeti da se JavaScript bori da pravilno izvrši čak i pogrešno napisane izraze. Ponekad radi, ali češće ne radi kako je planirano, pa se na kraju izvršavanje web skripte prekida zbog otkrivanja greške na potpuno drugom mjestu, na apsolutno ispravnom operatoru. Stoga je bolje ne dopustiti takve incidente.

Prioritet operatera

Posljednje pitanje koje ćemo ovdje pogledati je prednost operatora. Kako se sjećamo, prioritet utječe na redoslijed izvođenja izraza u izrazu.

Neka postoji sljedeći izraz:

U ovom slučaju, prvo će se vrijednosti c dodati vrijednost varijable b, a zatim će se od zbira oduzeti 10. Operatori ovog izraza imaju isti prioritet i stoga se izvršavaju strogo slijeva nadesno.

Sada razmislite o izrazu poput ovog:

Ovdje će se prvo vrijednost c pomnožiti s 10, a tek tada će se vrijednost b dodati rezultirajućem proizvodu. Operator množenja ima prednost nad operatorom sabiranja, pa će biti prekršeno strogo uređivanje slijeva nadesno.

Operatori dodjeljivanja imaju najmanji prioritet. Zbog toga se sam izraz prvo procjenjuje, a zatim se njegov rezultat dodjeljuje varijabli.

V Općenito, osnovni princip izvođenja svih operatora je sljedeći: prvo se izvršavaju operatori s većim prioritetom, pa tek onda operatori s nižim prioritetom. Operatori s istim prioritetom izvršavaju se redoslijedom kojim se pojavljuju (slijeva nadesno).

V tab. 14.9 navodi sve operatore koje smo proučavali prema silaznom redoslijedu prema njihovom prioritetu.

Tablica 14.9. Prednost operatora (opadajući redoslijed)

Operateri

Opis

++ - - ~! vrstu

Povećanje, smanjenje, promjena znaka, logičko NE, zaključak tipa

Množenje, dijeljenje, uzimanje ostatka

Sabiranje i spajanje nizova, oduzimanje

Operatori za usporedbu

Logičko I

Poglavlje 14. Uvod u web programiranje. JavaScript jezik

Tabela 14.9 (kraj)

Operateri

Opis

Logično ILI

Uslovni operator (vidi dolje)

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

Zadatak, jednostavan i složen

PAŽNJA!

Zapamtite ovu tabelu. Netačan redoslijed izvođenja izraza može dovesti do teško uočljivih grešaka u kojima naizgled apsolutno ispravan izraz daje pogrešan rezultat.

Ali šta ako moramo prekršiti uobičajeni redoslijed izvršavanja naredbi? Koristimo zagrade. S ovim zapisom prvo se izvode izrazi zatvoreni u zagradama:

a = (b + c) * 10;

Ovdje će se prvo izvršiti zbrajanje vrijednosti varijabli b i c, a zatim će se rezultirajući zbir pomnožiti s 10.

Operatori u zagradama takođe imaju prednost. Stoga se često koriste više ugniježđenih zagrada:

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

Ovdje će se naredbe izvršavati u sljedećem slijedu:

1. Dodatak b i c.

2. Dobiveni iznos pomnožite s 10.

3. Oduzimanje d od proizvoda.

4. Podijelite razliku sa 2.

5. Količniku dodajte 9.

Ako uklonite zagrade:

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

tada će redoslijed izvršavanja operatora biti sljedeći:

1. Množenje c i 10.

2. Dijeljenje d sa 2.

3. Dodatak b i proizvodi c i 10.

4. Oduzimanje količnika od podjele od rezultirajućeg zbroja d sa 2.

5. Rezultirajućoj razlici dodajemo 9.

Rezultat je potpuno drugačiji, zar ne?

  • Nedefinisano: "nedefinisano"
  • Null: "objekt"
  • Boolean: "boolean"
  • Broj: "broj"
  • Niz: "string"
  • Funkcija: "funkcija"
  • Sve ostalo: "objekt"

U ovu tabelu treba dodati sljedeće napomene:

1. typeof null === "objekat".

Teoretski, ovo je suptilna tačka. U statički upisanim jezicima, varijabla tipa objekta ne smije sadržavati objekt (NULL, nil, null pokazivač).

U praksi je to nezgodno u JavaScriptu. Tako će programeri ES 5.1 učiniti nešto intuitivnije: typeof null === "null".

No, budući da do sada imamo ES3, nemojte pogriješiti, na primjer, u ovome:

/ * Funkcija traži neki objekt i vraća ga ili null ako se ništa ne pronađe * / function search () () var obj = search (); if (typeof obj === "object") (// jesmo li zaista pronašli objekt (FAIL) obj.method ();)

2. Ne zaboravite na omotače (tip novog broja (5) === "objekt").

3. I ne zaboravite na pravo preglednika da bilo što rade s host objektima.

Nemojte se čuditi što Safari tvrdoglavo misli da je HTMLCollection tip funkcije, a IE prije verzije 9 zadržao je našu omiljenu funkciju alert () kao objekt. Chrome je i ranije razmišljao o RegExp -u kao funkciji, ali sada se čini da je to osjetio i na to odgovorio objektom.

toString ()

Pokušavati saznati tip vrijednosti iz rezultata metode toString () je besmisleno. U svim "klasama" ova metoda je redefinirana kao vlastita.

Metoda je dobra za prikaz informacija o otklanjanju grešaka, ali tip varijable se ne može odrediti.

Object.prototype.toString ()

Iako je toString redefiniran unutar konkretnih "klasa", još uvijek imamo njegovu originalnu implementaciju iz Objekta. Pokušajmo ga upotrijebiti:

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

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


Clinton razvodnjava ovaj teret

Ironično, ova metoda djeluje iznenađujuće dobro.

Za skalarne tipove, vraća ,,,.

Smiješno je to što se vraća čak i novi broj (5) čiji tip ovdje nije uspio.

Metoda ne uspijeva pri null i undefined. Vraćaju se različiti preglednici, ponekad očekivani, a ponekad općenito. Međutim, lako je odrediti vrstu ove dvije vrijednosti bez toga.

Zabava počinje kada dođemo do objekata (onih sa typeof === "objektom").

ugrađeni objekti funkcioniraju, praktično, uz prasak:

  • {} —
  • Datum -
  • Greška -
  • RegExp -

Jedino što ispada sa liste argumenata je to, dakle.
S objektima domaćina stvari se opet pogoršavaju.

U IE -u, DOM objekti su počeli postajati "normalni" objekti tek od 8. verzije, a zatim ne sasvim do kraja. Stoga se u IE 6-8 svi ti objekti (HTMLCOllection, DOMElement, TextNode i zajedno s dokumentom i prozorom) jednostavno pretvaraju.

U svim drugim preglednicima (uključujući IE9) već možete učiniti nešto s rezultatom toString. Iako sve također nije lako: HTMLCollection je tu. prozor - tada, onda, zatim. Ali već možete pokušati izvući nešto iz ovoga.

S DOMElementom je teže: prikazuje se kao, - vlastiti format za svaku oznaku. Ali ovdje će nam regularna sezona pomoći.

Priča je otprilike ista s ostalim objektima domaćina (u testovima lokacije i navigacije). Svuda osim u IE -u, oni se mogu identificirati po nizu.

Od nedostataka korištenja Object.prototype.toString ():

1. Ova mogućnost nije odobrena standardom. I ovdje bi se radije trebali radovati što sve funkcionira tako dobro, a ne žaliti zbog nekih nedostataka.

2. Određivanje tipa raščlanjivanjem niza vraćenog metodom koja uopće nije za određivanje vrste, a poziva se i na objekt kojem ne pripada, ostavlja neki trag na duši.

3. U starom IE -u, kao što vidite, objekti domaćina obično nisu identificirani.

Međutim, prilično je radni komad ako se koristi zajedno s drugim alatima.


Konstruktori

I na kraju, konstruktori. Ko bi mogao bolje reći o "klasi" objekta u JS -u ako ne njegov konstruktor?

Null i undefined nemaju niti omotače objekata niti konstruktore.

Ostatak skalarnih tipova ima omote, odnosno možete dobiti konstruktor:

(5) .constructor === Broj; (Broj .NaN) .constructor === Broj; (true) .constructor === Boolean; ("string") .constructor === String;

(5) .constructor === Broj; (Broj.NaN) .constructor === Broj; (true) .constructor === Boolean; ("string"). constructor === String;

Ali instanceof ovdje neće funkcionirati:

5 instanceof Broj; // false broj .NaN instanceof Number; // false true instance of Boolean; // lažno "string" instanceof String; // false

5 instanceof Broj; // lažni Number.NaN instanceof Number; // false true instance of Boolean; // lažno "string" instanceof String; // false

(instanceof će raditi za dugotrajni novi broj (5))

Sa funkcijama (koje su i objekti), instanceof će proslijediti:

console.log ((function () ()) instanceof Function); // true console.log ((function () ()) .constructor === Function); // istinito

console.log ((function () ()) instanceof Function); // true console.log ((function () ()). constructor === Function); // istinito

Svi objekti ugrađenih klasa se takođe lako identifikuju pomoću njihovih konstruktora: Array, Date, RegExp, Error.

Ovdje se javlja problem s argumentima čiji je konstruktor Object.

I drugo sa samim objektom, ili bolje rečeno, kako na njega odnositi objekt kreiran putem prilagođenog konstruktora.

Samo osnovni objekt može se definirati na ovaj način:

obj instanceof Object;

Kao jedna od varijanti definicije - ponoviti sve ostale moguće tipove (niz, greška ...) i ako se ništa ne podudara - "objekt".

Konstruktori i host objekti

S objektima domaćina stvari postaju sve gore.

Počnimo s činjenicom da ih IE do uključujući verziju 7 uopće ne smatra normalnim objektima. Oni jednostavno nemaju konstruktore i prototipe (u svakom slučaju programer ne može doći do njih).

Drugi preglednici rade bolje. Postoje konstruktori i pomoću njih možete odrediti klasu vrijednosti. Samo se oni u različitim preglednicima nazivaju različito. Na primjer, za HTMLCollection, konstruktor će biti ili HTMLCollection ili NodeList, ili čak NodeListConstructor.

Također biste trebali definirati osnovni konstruktor za DOMElement. U FF -u ovo je, na primjer, HTMLElement, iz kojeg su HTMLDivElement i drugi već naslijeđeni.

FireFox ispod 10. verzije i Opera ispod 11. Konstruktor zbirke je tu - Object.

constructor.name

Konstruktori također imaju svojstvo imena koje može biti korisno.

Sadrži naziv funkcije konstruktora, na primjer (5) .constructor.name === "Broj".

Ali:
1. U IE to uopće nije, čak ni u 9.
2. Preglednici ponovo oblikuju sve u Host-objekte (i često uopće nemaju ovo svojstvo). U Opera, DOMElement ima ime konstruktora općenito Function.prototype.
3. argumenti su opet "objekt".

zaključci

Nijedna od predstavljenih metoda ne daje stopostotnu definiciju vrste / klase vrijednosti u svim preglednicima. Međutim, zajedno, oni vam to dopuštaju.

U bliskoj budućnosti pokušat ću prikupiti sve podatke u tablice i dati primjer funkcije definiranja.

Operater vrstu vraća niz koji označava tip operanda.

Sintaksa

Operand slijedi operator tipa typeof:

Vrstu operand

Opcije

operand je izraz koji predstavlja objekt ili primitiv čiji se tip vraća.

Opis

U sljedećoj tablici navedene su moguće povratne vrijednosti typeof. Više informacija o vrstama i primitivima nalazi se na stranici.

Primjeri

// Brojevi typeof 37 === "broj"; typeof 3.14 === "broj"; typeof (42) === "broj"; typeof Math.LN2 === "broj"; typeof Infinity === "broj"; type NaN === "broj"; // iako je to "Not-A-Number" typeof Number (1) === "number"; // nikada ne koristite ovaj unos! // String typeof "" === "string"; typeof "bla" === "string"; typeof "1" === "string"; // imajte na umu da je broj unutar niza još uvijek tipa string typeof (typeof 1) === "string"; // typeof će uvijek vratiti niz u ovom slučaju typeof String ("abc") === "string"; // nikada ne koristite ovaj unos! // Booleans typeof true === "boolean"; typeof false === "boolean"; typeof Boolean (true) === "boolean"; // nikada ne koristite ovaj unos! // Simboli typeof Symbol () === "symbol" typeof Symbol ("foo") === "symbol" typeof Symbol.iterator === "symbol" // Nedefinisan tip undefined === "undefined"; typeof definedButUndefinedVariable === "undefined"; typeof undeclaredVariable === "undefined"; // Objekti typeof (a: 1) === "objekt"; // koristiti Array.isArray ili Object.prototype.toString.call // za razlikovanje regularnih objekata i niza typeof === "object"; typeof new Date () === "objekt"; // Ono što je dolje navodi greške i probleme. Ne koristiti! typeof new Boolean (true) === "objekt"; typeof new Number (1) === "objekt"; typeof new String ("abc") === "objekt"; // Funkcije typeof function () () === "function"; typeof class C () === "function"; typeof Math.sin === "funkcija";

null

// Ovo je definirano od rođenja JavaScript typeof null === "object";

U prvoj JavaScript implementaciji, vrijednosti su bile predstavljene vrstom oznake i parom vrijednosti. Tip oznake za objekte je bio 0. null je predstavljen kao nulti pokazivač (0x00 na većini platformi). Stoga je tip oznake za null bio nula, pa je povratna vrijednost typeof lažna. ()

Ispravka je predložena u ECMAScript -u (putem onemogućavanja), ali je odbijena. Ovo bi rezultiralo typeof null === "null".

Korištenje novog operatora

// Sve funkcije konstruktora kreirane sa "new" bit će tipa "object" var str = new String ("String"); var num = novi broj (100); typeof str; // Vraća "object" typeof num; // Vraća "objekt" // Ali postoji izuzetak za konstruktor funkcija var func = new Function (); typeof func; // Vraća "funkciju"

Regularni izrazi

Regularni izrazi koji se mogu pozivati ​​bili su nestandardni dodatak u nekim preglednicima.

Typeof / s / === "funkcija"; // Chrome 1-12 Typeof / s / === "objekt" nije kompatibilan sa ECMAScript 5.1; // Saglasno sa Firefox 5+ ECMAScript 5.1

Greške u vezi s privremenim mrtvim zonama

Prije ECMAScript 2015, bilo je zagarantovano da će operator typeof vratiti niz za bilo koji operand s kojim je pozvan. Ovo se promijenilo dodavanjem deklaracija let i const koje ne podižu blok. Sada, ako su varijable deklarirane sa let and const, a typeof ih se poziva u bloku deklaracije varijable, ali prije deklaracije, tada se baca ReferenceError. Ponašanje se razlikuje od neprijavljenih varijabli, za koje će typeof vratiti "nedefinirano". Varijable s opsegom bloka nalaze se u "privremenoj mrtvoj zoni" koja traje od početka bloka do proglašenja varijable. U ovoj zoni, pokušaj pristupa varijablama izaziva izuzetak.

Typeof undeclaredVariable === "undefined"; typeof newLetVariable; neka newLetVariable; // ReferenceError typeof newConstVariable; const newConstVariable = "zdravo"; // ReferenceError

Izuzeci

Svi trenutni preglednici imaju nestandardni document.all host objekt tipa Undefined.

Typeof document.all === "undefined";

Iako specifikacija dopušta nazive prilagođenih tipova za nestandardne egzotične objekte, potrebno je da se ti nazivi razlikuju od unaprijed definiranih. Situaciju u kojoj document.all nije definirano treba smatrati izuzetnim kršenjem pravila.

Specifikacije (uredi)

Specifikacija Status Komentari (1)
ECMAScript najnoviji nacrt (ECMA-262)
Nacrt
ECMAScript 2015 (6. izdanje, ECMA-262)
Definicija "Vrsta operatora" u ovoj specifikaciji.
Standard
ECMAScript 5.1 (ECMA-262)
Definicija "Vrsta operatora" u ovoj specifikaciji.
Standard
ECMAScript 3. izdanje (ECMA-262)
Definicija "Vrsta operatora" u ovoj specifikaciji.
Standard
ECMAScript prvo izdanje (ECMA-262)
Definicija "Vrsta operatora" u ovoj specifikaciji.
Standard Originalna definicija. Implementirano u JavaScript 1.1

Kompatibilnost preglednika

Ažurirajte podatke o kompatibilnosti na GitHubu

RačunariMobilniServer
ChromeEdgeFirefoxInternet ExplorerOperaSafariAndroid webviewChrome za AndroidFirefox za AndroidOpera za AndroidSafari na iOS -uSamsung InternetNode.js
vrstuChrome Potpuna podrška 1 Edge Potpuna podrška 12 Firefox Potpuna podrška 1 IE Potpuna podrška 3 Opera Potpuna podrška DaSafari Potpuna podrška DaWebView Android Potpuna podrška 1 Chrome Android Potpuna podrška 18 Firefox Android Potpuna podrška 4 Opera Android Potpuna podrška DaSafari iOS Potpuna podrška DaSamsung Internet Android Potpuna podrška 1.0 nodejs Potpuna podrška Da

Legenda

Potpuna podrška Potpuna podrška

IE posebne bilješke

U IE 6, 7 i 8, mnogi host objekti su objekti, ali ne i funkcije. Na primjer.