Identifikacija dinamičkog tipa. JavaScript, typeof, tipovi i klase Greške vezane za privremene mrtve zone

Identifikacija dinamičkog tipa

Dinamička identifikacija tipa (RTTI) omogućava vam da odredite tip objekta tokom izvršavanja programa. Ispostavilo se da je to korisno iz više razloga. Konkretno, koristeći referencu na osnovnu klasu, možete prilično precizno odrediti tip objekta kojem se može pristupiti putem ove reference. Dinamička identifikacija tipa također vam omogućava da unaprijed provjerite koliko će uspješno prebacivanje tipa biti, sprječavajući iznimku zbog pogrešnog prebacivanja tipa. Pored toga, dinamička identifikacija tipa je glavna komponenta refleksije.

Da bi podržao dinamičku identifikaciju tipa, C# nudi tri ključne riječi a: is, as i typeof. O svakoj od ovih ključnih riječi u nastavku se govori redom.

je operater

Specifičan tip objekta može se odrediti pomoću is operatora. Ispod je njegov opšti oblik:

izraz je tip

gdje izraz označava jedan izraz koji opisuje objekt čiji se tip testira. Ako je izraz kompatibilan ili istog tipa kao tip koji se testira, tada je rezultat ove operacije istinit, u suprotnom je lažan. Dakle, rezultat će biti istinit ako izraz ima tip koji se testira u ovom ili onom obliku. Operator is definira oba tipa kao kompatibilne ako su istog tipa ili ako je data konverzija reference, boksiranje ili raspakiranje.

Ispod je primjer korištenja is operatora:

Korišćenje sistema; imenski prostor ConsoleApplication1 ( klasa Dodaj ( ) klasa Sum: Dodaj ( ) klasa Program ( static void Main() ( Dodaj a = new Add(); Sum s = new Sum(); if (a je Dodaj) Console.WriteLine("Variable a je tipa Add"); if (s je Sum) Console.WriteLine("Tip varijable s je naslijeđen iz Add klase"); Console.ReadLine(); ) ) )

Operater kao

Ponekad želite da izvršite konverziju tipa u vreme izvođenja, ali ne i da izbacite izuzetak ako konverzija ne uspe, što je sasvim moguće sa prelivanjem tipa. Operator as služi ovoj svrsi, imajući sljedeći opći oblik:

izraz kao tip

gdje izraz označava jedan izraz koji se pretvara u navedeni tip.

Ako je ishod takve konverzije uspješan, onda se vraća referenca na tip, u suprotnom prazna referenca. Operator as se može koristiti samo za konverziju reference, identitet, boksovanje, raspakiranje. U nekim slučajevima, as operator može biti zgodna alternativa is operatoru. Kao primjer, razmotrite sljedeći program:

Korišćenje sistema; imenski prostor ConsoleApplication1 ( class Add ( ) class Sum: Add ( ) class Program ( static void Main() ( Add a = new Add(); Sum s = new Sum(); // Izvršite lijevanje tipa a = s kao Add; if (a != null) Console.WriteLine("Konverzija je bila uspješna" inače Console.WriteLine("Greška tokom konverzije") Console.ReadLine());

Rezultat izvršavanja ovog programa će biti uspješna konverzija.

JavaScript ili JS(skraćeno) nije lak jezik i programeri početnici neće naučiti o tome odmah. U početku uče osnove i sve izgleda šareno i lijepo. Ako idemo malo dublje, pojavljuju se JavaScript nizovi, objekti, povratni pozivi i sve slično, što vas često oduševi.

U JavaScript-u je važno pravilno provjeriti tip varijable. Recimo da želite da znate da li je varijabla niz ili objekat? Kako to ispravno provjeriti? U ovom konkretnom slučaju, postoje trikovi tokom verifikacije i ovaj post će biti o njima. Hajdemo odmah.

Provjera tipa varijable

Na primjer, trebate provjeriti da li je varijabla objekt, niz, niz ili broj. Možete koristiti typeof za ovo, ali neće uvijek reći istinu i u primjeru ispod pokazat ću zašto.

Napisao sam ovaj primjer da jasno pokažem zašto typeof nije uvijek pravi izbor.

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

Rezultat izvršavanja koda:

String broj broj objekt objekt

zar ne? - Naravno da ne. Postoje dva problema. Svaki od njih će biti detaljno opisan i predloženo rješenje.

Prvi problem: plutajući broj, izlaz kao broj

Comparison.float nije broj i umjesto broja trebao bi biti float (broj s pomičnim zarezom) da biste to popravili, možete kreirati funkciju s provjerom kao u kodu ispod.

Var_floatNumber = 9,22; var _notFloatNumber = 9; console.log(isFloat(_floatNumber)); console.log(isFloat(_notFloatNumber)); console.log(isFloat("")); funkcija isFloat(n)( return Number(n) === n && n % 1 !== 0; )

Funkcija isFloat() provjerava da li su sve vrijednosti u pokretnom zarezu. Prvo se provjerava da li je varijabla jednaka n broj (Broj(n) === n) i ako da, onda se vrši još jedna provjera za dijeljenje s ostatkom i ako postoji ostatak, onda boolean ( istina ili false) rezultat (n % 1 !== 0).

U gornjem primjeru se vraća istina, false I false. Prvo značenje je float tip, drugi nije - to je običan broj, a posljednji je samo prazan niz koji se ne uklapa u pravila.

Drugi problem: niz je definiran kao objekt

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

Postoji nekoliko načina da provjerite da li je varijabla tip niza.

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

Var data = new Array("hello", "world"); var isArr = data instanceof Array;

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

Var data = new Array("hello", "world"); var isArr = Array.isArray(podaci);

Treća opcija (najbolja, ali duga). Radi praktičnosti, ovu metodu možete učiniti funkcijom. Koristeći Object radimo . Ako rezultat Object.prototype.toString.call(data) nije jednak, tada varijabla nije niz ().

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

Posljednji rezultat kao funkcija pogodnosti:

Funkcija isArray(data) (vrati Object.prototype.toString.call(data) == "" )

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

Pogovor

Ispostavilo se da je snimak prilično velik nego što je prvobitno planirano. Ali zadovoljan sam jer prilično sažeto i jasno opisuje poteškoće pri provjeravanju varijabli u JavaScript-u i kako ih zaobići.

Ako i dalje imate pitanja, napišite ih ispod ovog unosa. Rado ću pomoći.

Operater typeof vraća string koji označava tip operanda.

Sintaksa

Operand slijedi operator typeof:

Typeof operand

Opcije

operand je izraz koji predstavlja objekat ili primitiv čiji se tip treba vratiti.

Opis

Sljedeća tabela navodi moguće povratne vrijednosti typeof. Više informacija o tipovima i primitivima možete pronaći na stranici.

Primjeri

// Numbers typeof 37 === "number"; typeof 3.14 === "broj"; typeof(42) === "broj"; typeof Math.LN2 === "broj"; typeof Infinity === "broj"; typeof NaN === "broj"; // iako je ovo tip broja (1) "Not-A-Number" === "broj"; // nikad ne koristi ovaj unos! // String typeof "" === "string"; typeof "bla" === "string"; typeof "1" === "string"; // imajte na umu da je broj unutar stringa još uvijek tipa string typeof (typeof 1) === "string"; // typeof će uvijek vratiti string u ovom slučaju typeof String("abc") === "string"; // nikad ne koristi ovaj unos! // Boolean typeof true === "boolean"; typeof false === "boolean"; typeof Boolean(true) === "boolean"; // nikad ne koristi ovaj unos! // Tip simbola Symbol() === "symbol" typeof Symbol("foo") === "symbol" typeof Symbol.iterator === "symbol" // Nedefiniran tip undefined === "undefined"; typeof declaredButUndefinedVariable === "nedefinisano"; typeof undeclaredVariable === "nedefinisano"; // Objekti typeof (a: 1) === "object"; // koristimo Array.isArray ili Object.prototype.toString.call // da napravimo razliku između regularnih objekata i nizova typeof === "object"; typeof new Date() === "object"; // Ono što slijedi dovodi do grešaka i problema. Nemojte ga koristiti! typeof new Boolean(true) === "objekat"; typeof new Number(1) === "objekat"; typeof new String("abc") === "object"; // Funkcije typeof function() () === "function"; typeof class C() === "funkcija"; typeof Math.sin === "funkcija";

null

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

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

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

Korištenje novog operatera

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

Regularni izrazi

Pozivi regularni izrazi bili su nestandardni dodatak u nekim pretraživačima.

Tip /s/ === "funkcija"; // Chrome 1-12 Nije usklađen sa ECMAScript 5.1 typeof /s/ === "object"; // Firefox 5+ je usklađen sa ECMAScript 5.1

Greške vezane za privremene mrtve zone

Prije ECMAScript 2015, operator typeof je garantirao da će vratiti string za bilo koji operand s kojim je pozvan. Ovo se promijenilo dodavanjem deklaracija let i const bez podizanja u bloku. Sada, ako su varijable deklarirane sa let i const i typeof se poziva na njih u bloku deklaracije varijable, ali prije deklaracije, tada se izbacuje ReferenceError. Ponašanje se razlikuje od nedeklariranih varijabli, za koje će typeof vratiti "nedefinirano". Varijable sa opsegom bloka imaju "privremenu mrtvu zonu" koja traje od početka bloka do deklarisanja varijable. U ovoj zoni, pokušaj pristupa varijablama izaziva izuzetak.

Tip undeclaredVariable === "nedefinisano"; typeof newLetVariable; neka newLetVariable; // ReferenceError typeof newConstVariable; const newConstVariable = "zdravo"; // ReferenceError

Izuzeci

U svim trenutnim pretraživačima postoji nestandardni host objekat document.all, koji je tipa Undefined.

Typeof document.all === "nedefinisano";

Iako specifikacija dozvoljava nazive prilagođenih tipova za nestandardne egzotične objekte, zahtijeva da se ta imena razlikuju od unaprijed definiranih. Situaciju u kojoj je document.all tipa undefined treba smatrati izuzetnim kršenjem pravila.

Specifikacije

Specifikacija Status Komentari
ECMAScript najnoviji nacrt (ECMA-262)
Nacrt
ECMAScript 2015 (6. izdanje, ECMA-262)
Definicija "Tip operatora" je u ovoj specifikaciji.
Standard
ECMAScript 5.1 (ECMA-262)
Definicija "Tip operatora" je u ovoj specifikaciji.
Standard
ECMAScript 3. izdanje (ECMA-262)
Definicija "Tip operatora" je u ovoj specifikaciji.
Standard
ECMAScript 1. izdanje (ECMA-262)
Definicija "Tip operatora" je u ovoj specifikaciji.
Standard Početna definicija. Implementirano u JavaScript 1.1

Kompatibilnost pretraživača

Ažurirajte podatke o kompatibilnosti na GitHub-u

KompjuteriMobilniServer
ChromeEdgeFirefoxInternet ExplorerOperaSafariAndroid webviewChrome za AndroidFirefox za AndroidOpera za AndroidSafari na iOS-uSamsung InternetNode.js
typeofChrome Potpuna podrška 1 Edge Potpuna podrška 12 Firefox Potpuna podrška 1 I.E. 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

Napomene specifične za IE

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

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

Tabela 14.5. Logički operatori

Opis operatera

! NE (logička inverzija)

&& I (logičko množenje)

|| ILI (logički dodatak)

Tabela 14.6. Rezultati izvršavanja AND i OR operatora

Operand 1

Operand 2

Tabela 14.7. Rezultati izvršavanja NOT operatora

typeof operator get

Unesite operator get typeof vraća string koji opisuje tip podataka operanda. Operand čiji tip želite da znate stavlja se iza ovog operatora i stavlja u zagrade:

s = typeof("str");

Kao rezultat izvršavanja ovog izraza, varijabla s će sadržavati string "string" koji ukazuje na tip stringa.

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

Tabela 14.8. Vrijednosti koje vraća typeof operator

Tip podataka

Povratni niz

String

Numerički

Tabela 14.8 (kraj)

Tip podataka

Povratni niz

Logično

Kompatibilnost i konverzija tipova podataka

Vrijeme je da razmotrimo još dva važna pitanja: kompatibilnost tipova podataka i konverziju iz jednog tipa u drugi.

Šta dobijete kada dodate dvije numeričke vrijednosti? Tako je - još jedna brojčana vrijednost. Šta ako dodate broj i niz? Teško je reći... Ovdje se JavaScript suočava s problemom nekompatibilnih tipova podataka i pokušava da te tipove učini kompatibilnim pretvaranjem jednog od njih u drugi. Prvo pokušava da konvertuje string u broj i, ako uspe, izvodi sabiranje. Ako ne uspije, broj će se konvertirati u niz i dva rezultirajuća niza će biti spojena. Na primjer, pokretanje Web skripte u Listingu 14.6 bi pretvorilo vrijednost b u numeričku vrijednost kada se doda a; tako će varijabla c sadržavati vrijednost 23.

Listing 14.6

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

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

d = "JavaScript"; e = 2;

Ali pošto se vrijednost varijable d ne može pretvoriti u broj, vrijednost e će se pretvoriti u niz, a rezultat - vrijednost f - će postati jednak

Booleove vrijednosti se pretvaraju u numeričke ili nizove vrijednosti, ovisno o konkretnom slučaju. Vrijednost true će biti pretvorena u broj 1 ili niz "1", a vrijednost false će se konvertirati u 0 ili "0". Obrnuto, broj 1 će biti konvertovan u tačno, a broj 0 u netačno. Također, false će se konvertirati u

Imamo vrijednosti null i undefined.

Dio III. Ponašanje web stranice. Web skripte

Može se vidjeti da se JavaScript bori da ispravno izvrši čak i loše napisane izraze. Ponekad to funkcionira, ali češće ne funkcionira sve kako je planirano, i na kraju se prekida izvršavanje web skripte zbog greške koja je otkrivena na potpuno drugom mjestu, na apsolutno ispravnoj izjavi. Stoga je bolje izbjegavati ovakve incidente.

Prioritet operatera

Posljednje pitanje koje ćemo ovdje pogledati je prioritet operatora. Kao što se sjećamo, prioritet utječe na redosljed u kojem se izvršavaju operatori u izrazu.

Neka postoji sljedeći izraz:

U ovom slučaju, prvo će se vrijednost c dodati vrijednosti varijable b, a zatim će se od sume oduzeti 10 Operatori ovog izraza imaju isti prioritet i stoga se izvršavaju striktno s lijeva na desno.

Sada razmotrite ovaj izraz:

Ovdje će se vrijednost c prvo pomnožiti sa 10, a tek onda će se rezultatu dodati vrijednost b. Operator množenja ima veći prioritet od operatora sabiranja, tako da će redoslijed "strogo slijeva na desno" biti prekinut.

Operatori dodjele imaju najniži prioritet. Zato se prvo evaluira sam izraz, a zatim se njegov rezultat dodjeljuje varijabli.

IN Generalno, osnovni princip za izvršavanje svih operatora je sledeći: prvo se izvršavaju operatori sa višim prioritetom, a tek onda operatori sa nižim prioritetom. Operatori sa istim prioritetom se izvršavaju redosledom kojim se pojavljuju (s lijeva na desno).

IN sto 14.9 navodi sve operatore koje smo proučavali u opadajućem redoslijedu prema njihovim prioritetima.

Tabela 14.9. Prioritet operatora (u opadajućem redoslijedu)

Operateri

Opis

++ -- - ~ ! typeof

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

Množenje, dijeljenje, ostatak

Sabiranje i spajanje nizova, oduzimanje

Operatori poređenja

Logično I

Poglavlje 14. Uvod u Web programiranje. JavaScript jezik

Tabela 14.9 (kraj)

Operateri

Opis

Logično OR

Uslovni operator(vidi dolje)

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

Zadatak, jednostavan i složen

PAŽNJA!

Zapamtite ovu tabelu. Nepravilno izvršavanje naredbi može uzrokovati greške koje je teško otkriti, u kojima naizgled apsolutno ispravan izraz daje netačan rezultat.

Ali šta ako treba da prekršimo normalan redosled izvršavanja naredbi? Koristimo zagrade. Kada su napisani na ovaj način, naredbe zatvorene u zagradama se prvo izvršavaju:

a = (b + c) * 10;

Ovdje će se prvo dodati vrijednosti varijabli b i c, a zatim će se rezultirajući zbir pomnožiti sa 10.

Operatori navedeni u zagradama također podliježu prioritetu. Zbog toga se često koriste više ugniježđene zagrade:

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

Ovdje će se operatori izvršavati u sljedećem redoslijedu:

1. Sabiranje b i c.

2. Dobijeni iznos pomnožite sa 10.

3. Oduzimanje d od proizvoda.

4. Podijelite razliku sa 2.

5. Dodavanje 9 količniku.

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. Podijelite d sa 2.

3. Sabiranje b i proizvod c i 10.

4. Oduzimanje količnika od dijeljenja od rezultirajućeg zbira d do 2.

5. Dodajte 9 rezultujućoj razlici.

Ispada potpuno drugačiji rezultat, zar ne?

  • Nedefinirano: "nedefinirano"
  • Null: "objekat"
  • Boolean: "boolean"
  • Broj: "broj"
  • String: "string"
  • Funkcija: "funkcija"
  • Sve ostalo: "objekat"

Ovoj tabeli treba dodati sljedeće napomene:

1. typeof null === "object" .

Teoretski, ovdje postoji jedna suptilna stvar. U statički tipiziranim jezicima, varijabla tipa objekta ne smije sadržavati objekt (NULL, nil, null pokazivač).

U praksi, ovo je nezgodno u JavaScriptu. Dakle, programeri ES 5.1 će uraditi nešto intuitivnije: typeof null === "null" .

Ali pošto još uvijek imamo ES3 svuda, nemojte pogriješiti, na primjer, s ovim:

/* Funkcija traži neki objekat i vraća ga ili null ako ništa nije pronađeno */ function search() () var obj = search(); if (typeof obj === "object") ( // da li smo zaista pronašli objekat (FAIL) obj.method(); )

2. Ne zaboravite na objekte omotača (typeof new Number(5) === “object”).

3. I ne zaboravite na pravo pretraživača da rade šta god žele sa host objektima.

Nemojte se iznenaditi što Safari tvrdoglavo smatra HTMLCollection tipom funkcije, a IE stariji od verzije 9 čuva našu omiljenu alert() funkciju kao objekt. Također, Chrome je ranije smatrao RegExp funkcijom, ali sada se čini da je došao k sebi i odgovorio na njega objektom.

toString()

Pokušaj da se sazna tip vrijednosti iz rezultata njegove metode toString() je besmislen. U svim "klasama" ova metoda je zamijenjena svojom.

Metoda je dobra za prikaz informacija o otklanjanju grešaka, ali se ne može koristiti za određivanje tipa varijable.

Object.prototype.toString()

Iako je toString poništen unutar određenih "klasa", još uvijek imamo njegovu originalnu implementaciju iz Object-a. Pokušajmo to iskoristiti:

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

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


Clinton olakšava ovu dosadnost

Začudo, ova metoda djeluje iznenađujuće dobro.

Za skalarne tipove, vraća , , , .

Smiješna stvar je da čak i novi Number(5) na kojem typeof nije uspio ovdje vraća .

Metoda ne uspijeva na null i undefined. Vraćaju se različiti pretraživači, ponekad očekivani, a ponekad, ponekad uopšteno. Međutim, možete lako odrediti vrstu ove dvije vrijednosti i bez toga.

Stvari postaju interesantne kada dođemo do objekata (one sa typeof === "object").

ugrađeni objekti rade praktično uz prasak:

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

Jedina stvar je što ispada sa liste argumenata, što je ili .
Stvari se ponovo pogoršavaju sa host objektima.

U IE-u, DOM objekti su počeli da postaju “normalni” objekti tek od verzije 8, a čak i tada ne u potpunosti. Stoga se u IE 6-8 svi ovi objekti (HTMLCOllection, DOMElement, TextNode, kao i dokument i prozor) jednostavno svode na .

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

S DOMElementom je složenije: prikazuje se u obliku, - različit format za svaku oznaku. Ali i tu će nam pomoći regularna sezona.

Priča je otprilike ista i sa ostalim host objektima (u testovima lokacije i navigatora). Svugdje osim IE, mogu se identificirati po liniji.

Nedostaci korištenja Object.prototype.toString():

1. Ova mogućnost nije obuhvaćena standardom. I ovdje se radije trebamo radovati što sve tako dobro funkcionira, a ne žaliti za nekim nedostacima.

2. Određivanje tipa raščlanjivanjem niza vraćenog metodom koja se uopšte ne koristi za određivanje tipa, a takođe se poziva na objektu na koji se ne odnosi, ostavlja neki talog u duši.

3. U starom IE-u, kao što možete vidjeti, normalno je ne identificirati host objekte.

Međutim, ovo je potpuno funkcionalna stvar kada se koristi u kombinaciji s drugim sredstvima.


Konstruktori

I konačno, dizajneri. Ko je bolje reći o "klasi" objekta u JS-u od njegovog konstruktora?

null i undefined nemaju ni objekte omotača niti konstruktore.

Drugi skalarni tipovi imaju omote, tako da možete dobiti i konstruktor:

(5).konstruktor === Broj;

(Broj .NaN) .konstruktor === Broj;

(true).constructor === Boolean;

5 instanceof Number ;

// lažan broj .NaN instanceof Number ;

// lažna istinita instanca Booleana ;

// false "string" instanceof String ;

// false

5 instanceof Number; // false Number.NaN instanceof Number; // lažna istinita instanca Booleana; // false "string" instanceof String; // false

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

Sa funkcijama (koje su također objekti) instanceof će raditi:

console.log ( (funkcija () ()) instanceof Funkcija);

// istina console.log ( (funkcija () ( ) ).constructor === Funkcija ) ;

// istina

console.log((funkcija () ()) instanceof Funkcija); // true console.log((function () ()).constructor === Funkcija); // istina

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

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

A drugi je sa samim objektom, odnosno kako mu dodijeliti objekt kreiran putem prilagođenog konstruktora.

Na ovaj način možete definirati samo osnovni objekt: obj instanceof Object; Jedna od opcija definicije je proći kroz sve ostale moguće tipove (Niz, Greška...) i ako nijedan od njih ne odgovara - “objekat”.

Konstruktori i host objekti

Stvari se pogoršavaju sa objektima domaćina.

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

U drugim pretraživačima stvari su bolje. Postoje konstruktori i možete ih koristiti za određivanje klase vrijednosti. Oni se samo pozivaju

različitim pretraživačima

drugačije. 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 , od kojeg HTMLDivElement i drugi već nasljeđuju.
Trik je bačen na FireFox ispod verzije 10 i Opera ispod 11. Konstruktor kolekcije je Object .
constructor.name

Konstruktori takođe imaju svojstvo name, što može biti korisno.

Nijedna od predstavljenih metoda ne pruža 100% određivanje tipa/klase vrijednosti u svim pretraživačima. Međutim, zajedno oni to omogućavaju.

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