Beim Schreiben eines JS -Programms müssen Sie möglicherweise häufig die Art eines Objekts beurteilen. Wenn Sie beispielsweise eine Funktion schreiben, müssen Sie unterschiedliche Code schreiben, indem Sie verschiedene Parametertypen beurteilen.
Zunächst können Sie an den Typeof -Operator denken und das folgende Beispiel sehen:
<script type = "text/javaScript"> var Object = {}; var b = true; alert (typeof object + "" + typeof b); </script>Die erhaltenen Ergebnisse sind wie folgt:
Aus den obigen Ergebnissen können wir feststellen, dass der Typ des Objekts mit dem Typeof -Operator angezeigt werden kann. Was wird also das Ergebnis des Geltungsbereichs des Typs des Operators und undefiniert sein?
/*var Object = {}; var b = true; alert (typeof object + "" + typeof b);*/ alert (typeof null + "" + typeof undefined)Der Typeof -Operator wirkt auf Null und zeigt tatsächlich "Objekt" an (dies scheint unwissenschaftlich zu sein, ich dachte, es würde "null" angezeigt) und die undefinierten Anzeigen "undefiniert" (dies entspricht dem Ergebnis, das wir hoffen). Wenn Sie daher den Typeof -Operator verwenden, um die Art eines Objekts zu beurteilen, seien Sie daher besonders vorsichtig, da dieses Objekt möglicherweise null ist. Das obige liefert nur einige Ergebnisse von Typen, die auf diese Objekte wirken. In der folgenden Tabelle werden die Ergebnisse des Typs des Typs von Boolean, Nummer, String, Array, Datum, Regexp, Objekt, Funktion, Null, undefiniert (interessierte Leser können es selbst testen) aufgeführt:
Aus den Ergebnissen der obigen Tabelle können wir sehen, dass Array, Datum und Regexp alle Objekte anzeigen. Warum also nicht direkt den Objekttyp anzeigen? Dies erfordert, dass ein anderer Operator von JS: InstanceOF -Operator abgeleitet wird, mit dem festgestellt wird, ob ein Objekt ein Objekt eines Typs ist, und der berechnete Wert ist wahr oder falsch. Schauen wir uns zuerst an:
var nun = new Date (); var muster =/^[/s/s]*$/; var names = ['zq', 'John']; alert ((jetzt Instanz des Datums) + "" + (Musterinstanz von regexp) + "" + (Namensinstanz von Array));
Offensichtlich kann der Typ des Objekts anhand dieser Instanz von der Instanz beurteilt werden, dies kann jedoch nur andere Typen mit Ausnahme des Grundtyps (einschließlich des Zeichenfolge -Typs) beurteilen und den Grundtyp nicht beurteilen. Beispielsweise kann jedoch nicht immer normal beurteilt werden. Wenn Sie den Fall eines Frameworks berücksichtigen, um festzustellen, dass das Objekt seines Typs ein von einem anderen Frame übergebenes Objekt ist, schauen Sie sich zunächst das folgende Beispiel an.
main.html
<! docType html> <html Lang = "en"> <kopf> <titels> Haupt </title> </head> <rahmenset cols = "45%,*"> <Frame name = "Frame1" src = "Frame1.html"/> <Frame2 "Frame2"
Frame1.html
<! docType html> <html Lang = "en"> <kopf> <meta charset = "utf-8"> <title> frame1 </title> </head> <script type = "text/javascript"> var names = ['riccio zhang', 'zq', 'John']; </script> <body style = "Hintergrund: #ccc"> </body> </html>
Frame2.html
<! docType html> <html lang = "en"> <pead> <meta charset = "utf-8"> <title> Frame2 </title> <script type = "text/javascript"> document.write ("top.frame1.names Instanz an Array:" + (Top.Frame1.Names Instancef)); document.write ("<br/>"); document.write ("top.frame1.namesinstanceof top.frame1.Array:" + (top.frame1.names Instanceof top.frame1.Array)); document.write ("<br/>"); document.write ("top.frame1.array === top.frame2.array?" + (top.frame1.array === top.frame2.array)); </script> </head> <body style = "Hintergrund: #747474"> </body> </html>Das Namensobjekt befindet sich im Frame1 -Framework und wird durch das Array des Frame1 -Frameworks erstellt. Wenn das Namensobjekt zum Vergleich in das Array in Frame2 gebracht wird, ist es offensichtlich, dass Namen keine Instanz des Arrays in Frame2 sind. Es wird angenommen, dass Frame1 und Frame2 überhaupt nicht gleich sind und überhaupt Array. Aus dem zweiten realistischen Ergebnis ist deutlich zu erkennen, dass Namen eine Instanz des Rahmens sind, in dem er sich befindet. Aus der dritten Ausgabe ist ersichtlich, dass das Array von Frame1 und das Array von Frame2 unterschiedlich sind. Was soll ich also tun, wenn ich auf den obigen Kreuzrahmenvergleich stoße? Wir können das Array, das dem Framework entspricht, nicht jedes Mal vergleichen. Es gibt eine notwendige Möglichkeit, das obige Problem zu lösen. Siehe den folgenden Code:
var toString = {} .toString; var nun = new Date (); alarm (toString.call (jetzt)){} .ToString bedeutet, die TOString -Methode für das Objektobjekt (eine der grundlegenden Methoden des Objektobjekts bei dieser Methode) zu erhalten. Das Aufrufen der nativsten toString () des Datumsobjekts (diese Methode ist die Methode der obigen Objekt) kann eine Typ -von Typ [Objektdatum] anzeigen. Wenn es sich um ein Array handelt, wird das Wort [Objektarray] generiert. Das heißt, das Ausführen der oben genannten Operationen zeigt ähnliche Wörter wie [Objektklasse]. Also müssen wir diese Zeichenfolge nur beurteilen, um ihren Typ zu kennen? Aus diesem Grund können Sie die folgende Werkzeugklasse schreiben:
Tools.js
var tools = (function(undefined){ var class2type = {}, toString = {}.toString; var fun = { type: function (obj){ return obj === null || obj === undefined ? String(obj) : class2type[toString.call(obj)] }, isArray: function (obj){ return Fun.Type (obj) === "Array"; 0; name.tolowerCase ();Tools bieten Methoden wie Typ, IsArray, Isfunktion usw., um den Typ des Objekts zu beurteilen. Nach den tatsächlichen Bedürfnissen können Sie Methoden hinzufügen, um den Typ selbst zu bestimmen. Typ akzeptiert einen OBJ -Parameter, der den tatsächlichen Typ des Objekts in Kleinbuchstaben zurückgibt. Wenn Sie beispielsweise beurteilen müssen, dass der Typ des Objekts ein Array ist, gibt diese Methode ein Array zurück.
Schreiben Sie gemäß der oben angegebenen Werkzeugklasse das obige Beispiel neu:
Fram2.html
<! docType html> <html Lang = "en"> <head> <meta charset = "utf-8"> <title> Frame2 </title> <script type = "text/javaScript" src = "tools.js"> </script> <script type = "text/javascript"> document.write ("top.rit.Write (" top.rite ("top.r. (top.frame1.names Instance von Array)); document.write ("<br/>"); document.write ("top.frame1.namesinstanceof top.frame1.Array:" + (top.frame1.names Instanceof top.frame1.Array)); document.write ("<br/>"); document.write ("top.frame1.array === top.frame2.array?" + (top.frame1.array === top.frame2.array)); document.write ("<br/>"); document.write ("Tools.isArray (top.frame1.names)?" + Tools.isArray (top.frame1.names)); </script> </head> <body style = "Hintergrund: #747474"> </body> </html>Zu diesem Zeitpunkt kann der Objekttyp nach der obigen Klasse leicht beurteilt werden.
Hinweis: In IE können Elemente wie Alarm nicht beurteilt werden.