1. Die Methode zur Beurteilung eines echten Arrays
Der einfachste Weg, ein Array in JavaScript zu erklären, ist:
var a = [];
Der direkteste Weg zu bestimmen, ob es sich um ein Array handelt, ist:
Die Codekopie lautet wie folgt:
ein Instanz von Array // true
A.Constructor == Array // true
Hier kommt eine Instanz von Syntax. Instanz ist ein Cloud -Operator. Wie "+-*/" ist seine Syntax wie folgt:
result = obj inance der Klasse
Es wird verwendet, um festzustellen, ob ein Objekt eine Instanz einer Klasse ist und das Betriebsergebnis wahr oder falsch zurückgibt. Die Definition der Klasse in JavaScript wird durch einen Konstruktor initialisiert, sodass der richtige Operator der Instanz -Syntax eine Funktionsinstanz sein muss, dh die Klasse -Instanzfunktion muss wahr sein. Alle Objekte sind Instanzen des Objekts, daher gibt jedes Objektinstanz von Objekt wahr zurück. Obwohl wir sagen, dass Objekte durch Konstruktoren initialisiert werden, überprüft InstanceOF nicht, ob das Objekt durch die Funktion konstruiert wird, sondern durch den Prototyp des Konstruktors vererbt wird. Das folgende Beispiel kann dieses Problem veranschaulichen:
Die Codekopie lautet wie folgt:
Funktionsbereich (niedrig, hoch) {
this.low = niedrig;
this.high = hoch;
}
Bereich.Prototype.Constructor == Range; //WAHR
Bereich.Prototype = {
Include: Funktion (x) {return (x> = this.low && x <= this.High); },
Ausschließen: Funktion (x) {return (x <this.low && x> this.High); }
}
var r = neuer Bereich (0, 100);
r Instanz der Reichweite; //FALSCH
r Instanz des Objekts; //WAHR
Bereich.Prototype.Constructor == Objekt; //WAHR
Obwohl R über einen neuen Bereich konstruiert ist, ist R kein Beispiel für die Reichweite. Das ist das Problem. Die Anweisung von Bereich.Prototypenzuordnungsanweisung überschreibt den Standardkonstruktor. Bevor der Prototyp zugewiesen wird, ist der Bereich. Das ist leicht zu verstehen, weil
Die Codekopie lautet wie folgt:
Bereich.Prototype = {
Include: Funktion (x) {return (x> = this.low && x <= this.High); },
Ausschließen: Funktion (x) {return (x <this.low && x> this.High); }
}
Eigentlich äquivalent zu:
Die Codekopie lautet wie folgt:
Bereich.Prototype = neues Objekt ({{
Include: Funktion (x) {return (x> = this.low && x <= this.High); },
Ausschließen: Funktion (x) {return (x <this.low && x> this.High); }
});
So range.prototype.constructor == Objekt, dann ist die Instanz, die durch einen neuen Bereich erstellt wurde, natürlich eine Instanz von Objekt.
Es ist direkter, die offizielle Erklärung zu sehen:
Die Instanz des Operators prüft nicht, ob R vom Bereichskonstruktor initialisiert wurde. Es prüft, ob es von Range.Prototyp erbt.
Es gibt auch einen Funktionstyp von JavaScript, der ähnliche Funktionen wie Instanz hat, aber spezifische grundlegende Datentypen zurückgibt: Anzahl, Zeichenfolge, Funktion, Objekt, undefiniert, boolean. Es gibt nur diese sechs Typen, und diejenigen, die nicht innerhalb dieser sechs Typen zurückgeben, dh Typeof ([]) gibt Objekt zurück, nicht ein Array.
Eine andere Syntax ist der Konstruktor, der Konstruktor gibt den Konstruktor des Objekts zurück:
Die Codekopie lautet wie folgt:
var a = [];
A.Constructor; // Array
Der Konstruktor ist die Initialisierungsfunktion eines Objekts, die neue Aufrufe verwendet. Wenn das Objekt ein Array ist, sollte sein Konstruktor ein Array sein, und die Klasse, die Sie geschrieben haben, ist nicht unbedingt wahr, da der Konstruktor im Prototyp geändert werden kann.
2. Methode zur Beurteilung von Pseudo-Array
In JavaScript gibt es ein Pseudo-Array. Es kann unter Verwendung einer durch Array ähnlichen Traversalmethode durchquert werden. Es hat ein Längenattribut, um die Länge des Elements zu erhalten. Sie können das [] -Mungs -Index verwenden, um das angegebene Element zu erhalten. Wir nennen diese Art von Objekt ein Pseudo-Array. Das Objekt in JQuery ist ein typisches Pseudo-Array, wie in der folgenden Abbildung gezeigt:
Daher ist der Schlüssel zu der Beurteilung, ob es sich um ein Pseudo-Array handelt, um zu beurteilen, ob es ein Längenattribut gibt und ob es eine grundlegende Array-Operation-Funktionsspleibe gibt. Das Folgende ist die Urteilsmethode:
Die Codekopie lautet wie folgt:
var is_array = function (value) {
Rückgabewert &&
typeof value === 'Objekt' &&
typeof value.length === 'Nummer' &&
typeof value.splice === 'Funktion' &&
! (value.Propertyisenumerable ('Länge'));
};
Hier wird PropertySenumerable verwendet, um festzustellen, ob die Länge Eigenschaft aufzählbar ist. Tatsächlich hat das native String -Objekt auch einen Array -Effekt, aber wir können es nicht als Array -Objekt behandeln. Daher müssen wir den Typ von Value == "Objekt" beurteilen, da ein String -Objekt eine Zeichenfolge zurückgibt.