Gibt es einen besseren Weg, um den Typ einer Variablen in JS zu erhalten als typeof
? Es funktioniert gut, wenn Sie:
> typeof 1
"number"
> typeof "hello"
"string"
Aber es ist nutzlos, wenn Sie versuchen:
> typeof [1,2]
"object"
>r = new RegExp(/./)
/./
> typeof r
"function"
Ich weiß von instanceof
, aber dazu müssen Sie den Typ vorher kennen.
> [1,2] instanceof Array
true
> r instanceof RegExp
true
Gibt es einen besseren Weg?
javascript
types
typeof
Aillyn
quelle
quelle
typeof new RegExp(/./); // "function"
n
anstelle des erwarteten ursprünglichen Namens. zBconstructor.name
könnte Ihnenn
anstelle des erwarteten vollständigen Namens gebenAntworten:
Angus Croll hat kürzlich einen interessanten Blog-Beitrag darüber geschrieben -
http://javascriptweblog.wordpress.com/2011/08/08/fixing-the-javascript-typeof-operator/
Er geht die Vor- und Nachteile der verschiedenen Methoden durch und definiert dann eine neue Methode 'toType' -
quelle
ActiveXObject
Zum Beispiel Internet Explorer- Instanzen.match(/\s([a-z,_,:,A-Z]+)/)
Uint8Array
. Betrachten Sie stattdessen die allgemeineren,match(/\s([^\]]+)/)
die alles behandeln sollten.\w
stattdessen denSie können versuchen, mit
constructor.name
.Wie bei allem JavaScript wird irgendwann jemand ausnahmslos darauf hinweisen, dass dies irgendwie böse ist. Hier ist also ein Link zu einer Antwort , die dies ziemlich gut abdeckt.
Eine Alternative ist zu verwenden
Object.prototype.toString.call
quelle
name
ist eine Erweiterung von ECMAScript und funktioniert nicht in allen Browsern.constructor.name
kann dies wahrscheinlich so etwas wien
der erwartete Objektname sein. Achten Sie also darauf - vor allem, wenn Sie nur in der Produktion minimieren.null
und habeundefined
leider keinen Konstruktor.Eine einigermaßen gute Typerfassungsfunktion ist die von YUI3 verwendete :
Dadurch werden viele der von Javascript bereitgestellten Grundelemente erfasst. Sie können jedoch jederzeit weitere hinzufügen, indem Sie das
TYPES
Objekt ändern . Beachten Sie, dasstypeof HTMLElementCollection
in Safari ein Bericht erstelltfunction
wird, der Typ (HTMLElementCollection) jedoch zurückgegeben wirdobject
quelle
Die folgende Funktion kann hilfreich sein:
Oder in ES7 (Kommentar bei weiteren Verbesserungen)
Ergebnisse:
Vielen Dank an @johnrees, dass Sie mich benachrichtigt haben über: Fehler, Versprechen, Generatorfunktion
quelle
typeOf(new Date())
typeOf(Promise.resolve())//promise
typeOf(function *() {})//generatorfunction
[ts] Cannot redeclare block-scoped variable 'toString'
Wir können auch ein kleines Beispiel von ipr101 ändern
und anrufen als
quelle
Einzeilenfunktion:
Dies ergibt das gleiche Ergebnis wie
jQuery.type()
quelle
Sie können
Object.prototype.toString
auf jedes Objekt anwenden :Dies funktioniert in allen Browsern mit Ausnahme des IE gut. Wenn Sie dies für eine Variable aufrufen, die aus einem anderen Fenster stammt, wird es nur ausgespuckt
[object Object]
.quelle
Meine 2 ¢! Wirklich, ein Teil des Grundes, warum ich dies hier trotz der langen Liste von Antworten vorwerfe, besteht darin, eine etwas
all in one
typischere Lösung bereitzustellen und in Zukunft Feedback zu erhalten, wie man sie erweitern kann, um mehr aufzunehmenreal types
.Wie oben erwähnt, habe ich mit der folgenden Lösung einige der hier gefundenen Lösungen kombiniert und einen Fix für die Rückgabe eines Werts für ein von jQueryjQuery definiertes Objekt integriert, sofern verfügbar . Ich hänge die Methode auch an den nativen Objektprototyp an. Ich weiß, dass das oft tabu ist, da es andere solche Erweiterungen stören könnte, aber das überlasse ich
user beware
. Wenn Ihnen diese Vorgehensweise nicht gefällt, kopieren Sie einfach die Basisfunktion an eine beliebige Stelle und ersetzen Sie alle Variablen vonthis
durch einen zu übergebenden Argumentparameter (z. B. Argumente [0]).Dann einfach mit Leichtigkeit verwenden, so:
Mehr Beispiele:
Wenn Sie etwas hinzufügen möchten, das möglicherweise hilfreich ist, z. B. das Definieren, wann ein Objekt mit einer anderen Bibliothek erstellt wurde (Moo, Proto, Yui, Dojo usw.), können Sie dies gerne kommentieren oder bearbeiten, damit es weitergeht genau und präzise. ODER rollen Sie zu dem, den GitHubich dafür gemacht habe, und lassen Sie es mich wissen. Dort finden Sie auch einen schnellen Link zu einer cdn min-Datei.
quelle
In meinen Vorversuchen funktioniert das ziemlich gut. Der erste Fall gibt den Namen eines Objekts aus, das mit "neu" erstellt wurde, und der zweite Fall sollte alles andere erfassen.
Ich verwende,
(8, -1)
weil ich davon ausgehe, dass das Ergebnis immer mit beginnen[object
und enden wird,]
aber ich bin nicht sicher, ob dies in jedem Szenario zutrifft.quelle
Ich denke, die universellste Lösung hier ist - zuerst zu suchen
undefined
undnull
dann einfach anzurufenconstructor.name.toLowerCase()
.quelle
.constructor.name
enthält der immer den Stringwert. Für undefined / null haben wir die entsprechenden Zeichenfolgen, die von der Funktion zurückgegeben werden.constructor
es sich um eine geerbte Eigenschaft handelt, wird dies für Objekte unterbrochen, die mit erstellt wurdenObject.create(null)
. Einfach genug zu reparieren, aber wie soll man es nennen? "[Objekt null]"?typeof
Bedingung wird verwendet, um den Variablentyp zu überprüfen, wenn Sie den Variablentyp in der if-else-Bedingung überprüfen, zquelle