Der typeof
Operator hilft uns nicht wirklich, den tatsächlichen Typ eines Objekts zu finden.
Ich habe bereits folgenden Code gesehen:
Object.prototype.toString.apply(t)
Frage:
Ist es die meisten genaue Art des Objekts Art der Überprüfung?
javascript
Royi Namir
quelle
quelle
Antworten:
Die JavaScript-Spezifikation bietet genau einen geeigneten Weg, um die Klasse eines Objekts zu bestimmen:
http://bonsaiden.github.com/JavaScript-Garden/#types
quelle
Object.prototype.toString.call(new FormData()) === "[object FormData]"
wahr wäre. Sie können auch verwendenslice(8, -1)
, umFormData
statt[object FormData]
Object.prototype
und{}
?Object.prototype.toString.call(new MyCustomObject())
kehrt aber zurück,[object Object]
währendnew MyCustomObject() instanceOf MyCustomObject returns true
ich genau das wollte (Chrome 54.0.2840.99 m)new MyCustomObject().constructor === MyCustomObject
.Das
Object.prototype.toString
ist ein guter Weg, aber seine Leistung ist die schlechteste.http://jsperf.com/check-js-type
Verwenden Sie
typeof
diese Option , um ein grundlegendes Problem (String, Number, Boolean ...)Object.prototype.toString
zu lösen und um etwas Komplexes (wie Array, Date, RegExp) zu lösen.und das ist meine Lösung:
benutzen als:
quelle
type
Funktion ist gut, aber sehen Sie sich an, wie sie im Vergleich zu einigen anderentype
Funktionen funktioniert. http://jsperf.com/code-type-test-a-test({}).toString.call(obj)
ist langsamer alsObject.prototype.toString
jsperf.com/object-check-test77Die akzeptierte Antwort ist richtig, aber ich definiere dieses kleine Dienstprogramm gerne in den meisten Projekten, die ich erstelle.
So verwendet:
Wenn Sie eckig verwenden, können Sie es sogar sauber injizieren lassen:
quelle
Behalten Sie den Prototyp im Griff, den Sie für das Objekt erwarten, und vergleichen Sie ihn mit ihm.
beispielsweise
quelle
o instanceof String; //true
?"foo" instanceof String
Pausentypeof(x)==='string'
stattdessen.Object.getPrototypeOf(true)
schlägt fehl, wo(true).constructor
zurückkehrtBoolean
.Ich würde argumentieren, dass die meisten der hier gezeigten Lösungen unter Überentwicklung leiden. Die wahrscheinlich einfachste Möglichkeit, zu überprüfen, ob ein Wert vom Typ
[object Object]
ist, besteht darin, die.constructor
Eigenschaft zu überprüfen :oder noch kürzer mit Pfeilfunktionen:
Das
a != null
Teil ist notwendig , weil man in passieren könntenull
oderundefined
und Sie können keinen Konstruktor Eigenschaft aus einem dieser Namen extrahieren.Es funktioniert mit jedem Objekt, das erstellt wurde über:
Object
Konstruktor{}
Ein weiteres nettes Merkmal ist die Möglichkeit, korrekte Berichte für benutzerdefinierte Klassen zu erstellen, die diese verwenden
Symbol.toStringTag
. Beispielsweise:Das Problem hierbei ist, dass beim Aufrufen
Object.prototype.toString
einer Instanz davon der falsche Bericht zurückgegeben[object Object]
wird:Die Überprüfung mit dem Konstruktor ergibt jedoch ein korrektes Ergebnis:
quelle
Der beste Weg, um den REAL-Typ eines Objekts herauszufinden (einschließlich des nativen Objekt- oder Datentypnamens (wie String, Date, Number, usw.) UND des REAL-Typs eines Objekts (auch benutzerdefinierte)), ist das Greifen die name-Eigenschaft des Konstruktors des Objektprototyps:
Native Type Ex1:
zeigt an:
Ex2:
zeigt an:
Benutzerdefinierte Klassen:
zeigt an:
quelle
null
oder istundefined
.Alte Frage, die ich kenne. Sie müssen es nicht konvertieren. Siehe diese Funktion:
Beispiele:
Kostengünstig und einfach.
quelle
false
wenn das Testobjektnull
oder istundefined
true
oderfalse
false
. Wie hilft dies bei der Beantwortung der Frage?Ich habe ein kleines Dienstprogramm zur Typprüfung zusammengestellt, das von den obigen richtigen Antworten inspiriert ist:
Beispiel:
quelle
null
oderundefined
odertrue
oderfalse