En train d'écrire un programme JS, vous devrez souvent juger le type d'objet. Par exemple, si vous écrivez une fonction, vous devez écrire différents code en jugeant différents types de paramètres.
Tout d'abord, vous pouvez penser à l'opérateur de type et voir l'exemple suivant:
<script type = "text / javascript"> var objet = {}; var b = true; alerte (typeof objet + "" + type de b); </cript>Les résultats obtenus sont les suivants:
D'après les résultats ci-dessus, nous pouvons voir que le type d'objet peut être affiché à l'aide de l'opérateur de type. Alors, quel sera le résultat de la portée du type de l'opérateur nul et non défini?
/ * var objet = {}; var b = true; alerte (typeof objet + "" + type de b); * / alerte (typeof null + "" + type de non défini)Le type d'opérateur agit sur NULL et affiche réellement "objet" (cela semble non scientifique, je pensais qu'il afficherait "Null '"), et les affiche non définis "Undefined" (cela répond au résultat que nous espérons). Par conséquent, lorsque vous utilisez l'opérateur de type pour juger le type d'un objet, soyez particulièrement prudent, car cet objet peut être nul. Ce qui précède ne donne que quelques résultats de type d'action sur ces objets. Le tableau suivant répertorie les résultats du type d'opérateur agissant sur booléen, numéro, chaîne, array, date, regexp, objet, fonction, null, indéfini (les lecteurs intéressés peuvent le tester vous-même):
À partir des résultats du tableau ci-dessus, nous pouvons voir que le tableau, la date et le regexp affichent tous les objets, alors pourquoi ne pas afficher directement le type d'objet? Cela nécessite qu'un autre opérateur soit dérivé de JS: InstructionOf Operator, qui est utilisé pour déterminer si un objet est un objet d'un certain type, et la valeur calculée est vraie ou fausse. Jetons un coup d'œil d'abord:
var now = new Date (); Var Pattern = / ^ [/ s / s] * $ /; var noms = ['zq', 'John']; alert ((maintenant instanceof date) + "" + (instance de modèle de regexp) + "" + (noms d'instance de tableau));
De toute évidence, le type de l'objet peut être jugé via cette instance, mais cela ne peut juger que d'autres types, à l'exception du type de base (y compris le type de chaîne), et il ne peut pas juger le type de base. Cependant, l'instance OFF ne peut pas toujours être jugée normalement. Compte tenu du cas d'un cadre, pour déterminer que l'objet de son type est un objet passé par un autre cadre, examinez d'abord l'exemple suivant.
main.html
<! doctype html> <html lang = "en"> <éadf> <itle> main </ title> </ head> <frameset Cols = "45%, *"> <frame name = "frame1" src = "frame1.html" /> </ frameSet> </ html>
trame1.html
<! doctype html> <html lang = "en"> <éadf> <meta charset = "utf-8"> <itle> frame1 </ title> </ head> <script type = "text / javascript"> var noms = ['riccio zhang', 'zq', 'John']; </ script> <body style = "background: #ccc"> </ body> </html>
trame2.html
<! doctype html> <html lang = "en"> <éadf> <meta charset = "utf-8"> <tight> frame2 </title> <script type = "text / javascript"> document.write ("top.frame1.Names d'instance array:" + (top.frame1.Names instrieof array)); document.write ("<br/>"); Document.Write ("top.Frame1.Names instanceof 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)); </cript> </ head> <body style = "background: # 747474"> </body> </html>L'objet Noms est dans le cadre Frame1 et est créé par le tableau du cadre Frame1. Si l'objet Noms est emmené sur le tableau dans Frame2 à titre de comparaison, il est évident que les noms ne sont pas une instance de tableau dans Frame2. On pense que Frame1 et Frame2 ne sont pas le même et le tableau du tout. D'après le deuxième résultat réaliste, on peut clairement voir que les noms sont une instance du cadre où il se trouve. À partir de la troisième sortie, on peut voir que le tableau de Frame1 et le tableau de Frame2 sont différents. Alors, que dois-je faire si je rencontre la comparaison de trame croisée ci-dessus? Nous ne pouvons pas comparer le tableau correspondant au cadre à chaque fois. Il existe un moyen nécessaire de résoudre le problème ci-dessus. Voir le code suivant:
var toString = {} .toString; var now = new Date (); alerte (toString.Call (maintenant)){} .tostring signifie obtenir la méthode ToString sur l'objet objet (l'une des méthodes de base de l'objet objet lorsque cette méthode), et toString.Call (maintenant) signifie appeler la méthode ToString. Appeler la méthode ToString () la plus native de l'objet date (cette méthode est la méthode ci-dessus objet) peut afficher une chaîne de type [date d'objet]. S'il s'agit d'un tableau, le mot [tableau d'objets] sera généré. C'est-à-dire que l'exécution des opérations ci-dessus affichera des mots similaires à [la classe d'objets]. Nous avons donc juste besoin de juger cette chaîne pour connaître son type? À partir de cela, vous pouvez écrire la classe d'outils suivante:
outils.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) {retour fun.type (obj) === "array";}, isfunction: function (obj) {return fun.type (obj) === "fonction"; 0; name.tolowercase ();});Les outils fournissent des méthodes telles que le type, l'ISARray, l'isfonction, etc. pour juger le type de l'objet. Selon les besoins réels, vous pouvez ajouter des méthodes pour déterminer le type par vous-même. Le type accepte un paramètre OBJ, qui renvoie le type réel de l'objet sous forme minuscule. Par exemple, si vous devez juger que le type de l'objet est le tableau, cette méthode renvoie un tableau.
Selon la classe d'outils fournie ci-dessus, réécrivez l'exemple ci-dessus:
fram2.html
<! doctype html> <html lang = "en"> <éadf> <meta charset = "utf-8"> <itle> frame2 </ title> <script type = "text / javascript" src = "tools.js"> </ script> <script type = "text / javascript"> document.write ("top.frame11.names instriel:" + (top.nrite (top.frame11.names instriers d'instructions: "+ (top.nrite. instance de tableau)); document.write ("<br/>"); Document.Write ("top.Frame1.Names instanceof 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 ("TOLS.SArray (top.Frame1.Names)?" + TOLS.SARRAY (top.Frame1.Names)); </cript> </ head> <body style = "background: # 747474"> </body> </html>À ce stade, le type d'objet peut être facilement jugé par la classe ci-dessus.
Remarque: dans IE, des éléments tels que Alert ne peuvent pas être jugés.