typeof
und instanceof
werden beide zur Bestimmung von Datentypen verwendet, ihre Verwendungsszenarien sind jedoch unterschiedlich und einige Details erfordern besondere Aufmerksamkeit. Lassen Sie uns als nächstes herausfinden, diesen Wissenspunkt gründlich beherrschen und keine Angst mehr vor den Fragen des Interviewers haben.
typeof
ist ein unärer Operator, der vor einem Operanden steht, der einen beliebigen Typ haben kann. Es gibt eine Zeichenfolge zurück, die den Typ des Operanden beschreibt. Bitte schauen Sie sich die Kastanie an:
const type = typeof 'Long Live China'; // string Typ von 666; //Nummer typeof true; // boolean typeof undefiniert; // undefiniert typeof Symbol(); // symbol typeof 1n; // bigint typeof () => {}; // Funktion typeof []; // Objekt typeof {}; // Objekt typeof new String('xxx'); // Objekt typeof null; // object
Wie aus den obigen Beispielen hervorgeht, kann typeof
nur grundlegende Datentypen und Funktionen genau bestimmen (Funktionen sind eigentlich Objekte und gehören nicht zu einem anderen Datentyp, können aber auch mit typeof unterschieden werden) und nicht Der Out-Referenzdatentyp (alle Rückgabeobjekte) muss genau bestimmt werden.
Zu beachten ist, dass der Aufruf typeof null
object
zurückgibt. Dies liegt daran, dass der Sonderwert null
als Verweis auf ein Nullobjekt (auch Nullobjektzeiger genannt) betrachtet wird.
Wenn Sie den Referenzdatentyp genau bestimmen möchten, können Sie instanceof
verwenden.
Der instanceof
-Operator wird nach einem Operanden und vor dem angegebenen Objekt platziert. Es gibt einen booleschen Wert zurück, der angibt, ob der Operand eine Instanz des angegebenen Objekts ist:
const result = [] exampleof Array; // true const Person = function() {}; const p = neue Person(); p Instanz von Person; // true const message = new String('xxx'); message instanceof String; // True-
typeof gibt den Basistyp eines Operanden zurück. Instanceof gibt einen booleschen Wert zurück.
Instanceof kann den Referenzdatentyp genau bestimmen, kann den Basisdatentyp jedoch nicht korrekt bestimmen
. außer null), aber es ist unmöglich, den Referenzdatentyp (außer Funktion) zu bestimmen,
typeof
als auch instanceof
haben bestimmte Nachteile und können nicht die Anforderungen aller Szenarien erfüllen. Wenn Sie Datentypen universell erkennen müssen, können Sie Object.prototype.toString.call()
verwenden:
Object.prototype.toString.call({}); // „[object Object]“ Object.prototype.toString.call([]); // „[object Array]“ Object.prototype.toString.call(666); // „[Objektnummer]“ Object.prototype.toString.call('xxx'); // "[object String]"
Beachten Sie, dass diese Methode einen String im Format "[object Object]"
zurückgibt.
Zur bequemeren Verwendung können wir diese Methode kapseln:
function getType(value) { let type = typeof value; if (type !== 'object') { // Wenn es sich um einen Basisdatentyp handelt, direkt zurückgeben return type; } // Wenn es sich um einen Referenzdatentyp handelt, wird eine weitere Beurteilung vorgenommen und das reguläre Rückgabeergebnis ist return Object.prototype.toString.call(value).replace(/^[object (S+)]$/, ' $1'); } getType(123); // Zahl getType('xxx'); // string getType(() => {}); // Funktion getType([]); // Array getType({}); // Objekt getType(null); // Null