1. La méthode de jugement d'un réel tableau
Le moyen le plus simple de déclarer un tableau en JavaScript est:
var a = [];
Le moyen le plus direct de déterminer s'il s'agit d'un tableau est:
La copie de code est la suivante:
une instance de tableau // vrai
A. Constructor == Array // Vrai
Voici une instance de syntaxe. InstructionOf est un opérateur cloud. Comme "+ - * /", sa syntaxe est la suivante:
Résultat = OBJ Intance of Class
Il est utilisé pour déterminer si un objet est une instance d'une classe, et le résultat de l'opération renvoie True ou Faux. La définition de la classe dans JavaScript est initialisée via un constructeur, donc le bon opérateur de la syntaxe d'instance de syntaxe doit être une instance de fonction, c'est-à-dire que la fonction d'instance de classe doit être vraie, et si le bon opérateur n'est pas une fonction lors de l'utilisation de l'instance, une exception TypeError sera lancée. Tous les objets sont des instances d'objet, donc toute instance d'objet Of Object renvoie true. Bien que nous disions que les objets sont initialisés via des constructeurs, l'instance OFF ne vérifie pas si l'objet est construit par la fonction, mais est hérité du prototype du constructeur. L'exemple suivant peut illustrer ce problème:
La copie de code est la suivante:
Plage de fonctions (faible, haut) {
this.low = bas;
this.high = high;
}
Range.prototype.constructor == gamme; //vrai
Range.prototype = {
Inclure: fonction (x) {return (x> = this.low && x <= this.high); },
exclure: fonction (x) {return (x <this.low && x> this.high); }
}
var r = nouvelle plage (0, 100);
r instanceof gamme; //FAUX
r instanceof objet; //vrai
Range.prototype.constructor == objet; //vrai
Bien que R soit construit via une nouvelle plage, R n'est pas une instance de plage. C'est le problème. L'instruction Range.Protype Affectation remplace le constructeur par défaut. Avant que le prototype ne soit attribué, la plage.prototype.Constructor est la plage, et une fois l'affectation, il devient un objet. C'est facile à comprendre parce que
La copie de code est la suivante:
Range.prototype = {
Inclure: fonction (x) {return (x> = this.low && x <= this.high); },
exclure: fonction (x) {return (x <this.low && x> this.high); }
}
En fait, équivalent à:
La copie de code est la suivante:
Range.prototype = nouvel objet ({
Inclure: fonction (x) {return (x> = this.low && x <= this.high); },
exclure: fonction (x) {return (x <this.low && x> this.high); }
});
SO Range.prototype.constructor == Objet, alors l'instance créée via une nouvelle plage est bien sûr une instance d'objet.
Il est plus direct de voir l'explication officielle:
L'instance d'opérateur ne vérifie pas réellement si R a été initialisé par le constructeur de plage. Il vérifie s'il hérite de la plage.pototype.
Il existe également un type de fonction dans JavaScript qui a des fonctions similaires à l'instance, mais il renvoie des types de données de base spécifiques: nombre, chaîne, fonction, objet, non défini, booléen. Il n'y a que ces six types, et ceux qui ne sont pas dans ces six types de retour objet, c'est-à-dire, le typeof ([]) renvoie l'objet, pas le tableau.
Une autre syntaxe impliquée est le constructeur, le constructeur renvoie le constructeur de l'objet:
La copie de code est la suivante:
var a = [];
A. Constructor; //Tableau
Le constructeur est la fonction d'initialisation d'un objet, qui utilise de nouveaux appels. Si l'objet est un tableau, alors son constructeur doit être un tableau, et la classe que vous avez écrite n'est pas nécessairement vraie, car le constructeur du prototype peut être modifié.
2. Méthode de jugement pseudo-array
Il y a un pseudo-array en JavaScript. Il peut être traversé à l'aide d'une méthode de traversée similaire au tableau. Il a un attribut de longueur pour obtenir la longueur de l'élément. Vous pouvez utiliser l'indice [] pour obtenir l'élément spécifié. Nous appelons ce type d'objet un pseudo-array. L'objet en jQuery est un pseudo-arrié typique, comme le montre la figure ci-dessous:
Par conséquent, la clé pour juger s'il s'agit d'un pseudo-arrayage est de juger s'il y a un attribut de longueur et s'il y a une épissure de fonction de fonctionnement de la table de base. Ce qui suit est la méthode de jugement:
La copie de code est la suivante:
var is_array = fonction (valeur) {
valeur de retour &&
Typeof Value === 'Object' &&
typeof value.length === 'nombre' &&
type de valeur.splice === 'fonction' &&
! (valeur.propertyisenuable ('longueur'));
};
Ici, la propriété est utilisée pour déterminer si la propriété de longueur est énumérable. En fait, l'objet de chaîne native a également un effet de tableau, mais nous ne pouvons pas le traiter comme un objet de tableau, nous devons donc juger le type de valeur == "objet", car le type d'un objet de chaîne renvoie une chaîne.