Wie überprüfen Sie, ob ein Wert ein Objekt in JavaScript ist?
javascript
object
types
javascript-objects
Danny Fox
quelle
quelle
null
es sich um ein Objekt handelt).Antworten:
UPDATE :
Diese Antwort ist unvollständig und führt zu irreführenden Ergebnissen . Wird beispielsweise
null
auchobject
in JavaScript als Typ betrachtet , ganz zu schweigen von einigen anderen Randfällen. Befolgen Sie die unten stehende Empfehlung und fahren Sie mit der anderen "am besten bewerteten (und richtigen!) Antwort" fort .Ursprüngliche Antwort :
Versuchen Sie es mit
typeof(var)
und / odervar instanceof something
.BEARBEITEN: Diese Antwort gibt eine Vorstellung davon, wie die Eigenschaften von Variablen untersucht werden können, ist jedoch kein kugelsicheres Rezept (schließlich gibt es überhaupt kein Rezept!), Um zu überprüfen, ob es sich um ein Objekt handelt, das weit davon entfernt ist. Da die Leute dazu neigen, nach etwas zu suchen, das sie von hier kopieren können, ohne Nachforschungen anzustellen, würde ich dringend empfehlen, dass sie sich der anderen, am besten bewerteten (und korrektesten!) Antwort zuwenden.
quelle
typeof
ist ein Operator, also keine Notwendigkeit für()
.typeof
Gibt 'Objekt' für null zurück, das kein Objekt ist, undinstanceof
funktioniert nicht für Objekte, die mit erstellt wurdenObject.create(null)
.Wenn
typeof yourVariable === 'object'
, ist es ein Objekt oder null. Wenn Sie null ausschließen möchten, machen Sie es einfachtypeof yourVariable === 'object' && yourVariable !== null
.quelle
yourVariable !== null
eine bessere Praxis?typeof null == 'object'
dies in ES6 nicht behoben wird . Sie sagten:This proposal has been rejected. It was implemented in V8 but it turned out that it broke a lot of existing sites. In the spirit of One JavaScript this is not feasible.
typeof
da es einige Sonderfälle gibt, die nicht unbedingt viel Sinn ergeben. Wenn Sie versuchen, zwischen Arrays und Objekten zu unterscheiden, die keine Arrays sind, möchten Sie diese definitiv nicht verwendentypeof
.Object.prototype.toString.call(yourVar)
, da du dein Var bist, was du inspizieren musst. Im Falle von Arrays,Object.prototype.toString.call([1,2])
kehrt[object Array]
Definieren wir "Objekt" in Javascript . Gemäß den MDN-Dokumenten ist jeder Wert entweder ein Objekt oder ein Grundelement:
Was ist ein Primitiv?
3
'abc'
true
null
undefined
Was ist ein Objekt (dh kein Primitiv)?
Object.prototype
Object.prototype
Function.prototype
Object
Function
function C(){}
- benutzerdefinierte FunktionenC.prototype
- die Prototyp-Eigenschaft einer benutzerdefinierten Funktion: Dies ist keinC
Prototypnew C()
- "Neu" - eine benutzerdefinierte FunktionMath
Array.prototype
{"a": 1, "b": 2}
- Objekte, die in Literalschreibweise erstellt wurdennew Number(3)
- Umhüllungen von GrundelementenObject.create(null)
Object.create(null)
So überprüfen Sie, ob ein Wert ein Objekt ist
instanceof
an sich wird nicht funktionieren, weil es zwei Fälle übersieht:typeof x === 'object'
funktioniert wegen falsch positiver (null
) und falsch negativer (Funktionen) nicht:Object.prototype.toString.call
funktioniert nicht, weil für alle Grundelemente falsch positive Ergebnisse vorliegen:Also benutze ich:
@ Daans Antwort scheint auch zu funktionieren:
weil laut MDN-Dokumenten :
Eine dritte Möglichkeit, die Arbeit scheint (nicht sicher , ob es 100%) verwendet wird ,
Object.getPrototypeOf
die eine Ausnahme auslöst , wenn ihr Argument nicht ein Objekt ist:quelle
obj === Object(obj)
Gibttrue
für Arrays zurück.var x = []; console.log(x === Object(x)); // return true
getPrototypeOf
funktioniert zB nicht mit widerrufenen Proxys, die Objekte sind, aber werfen.({}).toString.apply(obj) === '[object Object]'
unterscheidet dies zwischen Arrays und Objekten, die keine Arrays sindunderscore.js bietet die folgende Methode, um herauszufinden, ob etwas wirklich ein Objekt ist:
AKTUALISIEREN
Aufgrund eines früheren Fehlers in V8 und einer geringfügigen Optimierung der Mikrogeschwindigkeit sieht die Methode seit underscore.js 1.7.0 (August 2014) wie folgt aus :
quelle
return obj === Object(obj) && Object.prototype.toString.call(obj) !== '[object Array]'
null
auch. Sollte die akzeptierte Antwort sein.Object.prototype.toString.call(myVar)
wird zurückkehren:"[object Object]"
wenn myVar ein Objekt ist"[object Array]"
wenn myVar ein Array istWeitere Informationen dazu und warum es eine gute Alternative zu typeof ist, finden Sie in diesem Artikel .
quelle
typeof [] === 'object'
->true
. Das ist es, was Sie diese Methode brauchen.Object.prototype.toString.call(3)
->"[object Number]"
.Object.prototype.toString.call(new Number(3))
->"[object Number]
"getType=function(obj){return Object.prototype.toString.call(obj).match(/\[object (\w+)\]/)[1];};
Zum einfachen Prüfen gegen Objekt oder Array ohne zusätzlichen Funktionsaufruf (Geschwindigkeit). Wie auch hier gepostet .
isArray ()
isObject () - Hinweis: Nur für Objektliterale verwenden, da für benutzerdefinierte Objekte wie new Date oder new YourCustomObject false zurückgegeben wird.
quelle
isObject
funktioniert nur mit Objektliteralen. Wenn ich einen benutzerdefinierten Typ erstelle, eine Instanz des Typs erstelle und ihnfalse
Boolean(a)
ist länger, aber weitaus intuitiver. Verwenden Sie einfach nichtnew Boolean(a)
: ( hier ist der Grund )!{
Zeichen beginnt . Für den Array-Fall können Sie verwenden,Array.isArray()
um festzustellen, ob es sich bei einem Array um ein Array handelt , solange Sie IE <9 nicht unterstützen müssen . Es besteht alle von Ihnen bereitgestellten Testfälle.Ich mag einfach:
Wenn es sich bei dem Element um ein JS-Objekt handelt und es sich nicht um ein JS-Array handelt und nicht
null
... Wenn sich alle drei als wahr erweisen, kehren Sie zurücktrue
. Wenn eine der drei Bedingungen fehlschlägt, wird der&&
Test kurzgeschlossen undfalse
zurückgegeben. Dernull
Test kann bei Bedarf weggelassen werden (je nachdem, wie Sie ihn verwendennull
).DOKUMENTE:
http://devdocs.io/javascript/operators/typeof
http://devdocs.io/javascript/global_objects/object
http://devdocs.io/javascript/global_objects/array/isarray
http://devdocs.io/javascript/global_objects/null
quelle
new Date()
ein Objekt zurückgegeben wird. Ein Array ist aus logischer Sicht kein Objekt - obwohl JavaScript sie als solche behandelt und meldet. In der Praxis ist es jedoch nicht hilfreich, sie gleich zu sehen, weil sie es nicht sind. Ein Objekt hatlength
zum Beispiel kein Attribut und keine Methoden wie push (). Und manchmal möchten Sie einer Funktion überladene Parameter geben, bei denen Sie einen Unterschied zwischen einem Array oder einem Objekt machen müssen, insbesondere wenn andere Parameter davon abhängen, welcher angegeben wurde.length
Eigenschaft oder Methoden wie haben könnenpush
,Object.create(Array.prototype)
ist ein triviales Gegenbeispiel für ein Nicht-Array-Objekt, das diese hat. Das Besondere an Arrays ist, dass es sich um exotische Objekte mit einer benutzerdefinierten [[DefineOwnProperty]] wesentlichen internen Methode handelt, die jedoch weiterhin Objekte sind.length
Eigenschaft haben können (ich meinte, dass Objektliteralelength
standardmäßig kein Attribut haben). Ich habe geschrieben, dass Arrays aus logischer Sicht keine Objekte sind . Ich spreche von Programmlogik. Manchmal muss überprüft werden, ob ein Array ein "echtes" Array und definitiv kein "echtes" Objekt ist. DafürArray.isArray()
ist es da. Stellen Sie sich vor, Sie haben eine Funktion, die ein Objekt oder ein Array von Objekten akzeptiert. Das Überprüfen auf ein spezielles Attribut oder eine spezielle Methode ist eine schmutzige Lösung. Der native Weg ist immer besser.typeof null
ist"object"
nicht"undefined"
.Mit Funktion
Array.isArray
:Ohne Funktion
Array.isArray
:Nur überrascht, wie viele Upvotes für falsche Antworten 😮
Nur 1 Antwort hat meine Tests bestanden !!! Hier habe ich meine vereinfachte Version erstellt:
Was mich betrifft, ist es klar und einfach und funktioniert einfach! Hier meine Tests:
EINMAL MEHR: Nicht alle Antworten bestehen diese Tests !!! 🙈
Wenn Sie überprüfen müssen, ob das Objekt eine Instanz einer bestimmten Klasse ist , müssen Sie den Konstruktor mit Ihrer bestimmten Klasse überprüfen, z.
einfacher Test:
Als Ergebnis erhalten Sie strengen und robusten Code!
Für den Fall , werden Sie nicht schaffen Funktionen wie
isDate
,isError
,isRegExp
usw. Sie Option in Betracht ziehen kann dieser verallgemeinerten Funktionen zu nutzen:Es funktioniert nicht für alle zuvor erwähnten Testfälle richtig, aber es ist gut genug für alle Objekte (einfach oder konstruiert).
isObject
funktioniert nicht, wenn dieObject.create(null)
interne Implementierung hierObject.create
erläutert wird , aber Sie können sieisObject
in einer komplexeren Implementierung verwenden:Basierend auf dieser Implementierung wurde bereits ein Paket auf npm v1 erstellt! Und es funktioniert für alle zuvor beschriebenen Testfälle! 🙂
quelle
isDate
für Ihr DateObject den Zweck verwenden, robusten Code zu schreiben, sonst haben Sie eine sprödeisObject
Methode.Date
in meinem Kommentar wurde schlecht gewählt, weil ja, die Antwort diskutiertDate
. IstDate
aber nur eine von unendlich möglichen Klassen und der Punkt gilt für jede andere Klasse. Beispiel: gibtclass Foo() { }; var x = new Foo(); isObject(x)
zurückfalse
. Ich weiß nicht genau, was der Anwendungsfall des OP ist, aber es ist einfach, sich Szenarien vorzustellen, in denen es unmöglich sein wird , über alle möglichen Klassen Bescheid zu wissen und spezifisch gegen jede einzelne zu prüfen.Oh mein Gott! Ich denke, das könnte kürzer sein als je zuvor. Sehen wir uns das an:
Kurz- und Schlusscode
Erklärt
Rückgabetypen
Typ von JavaScript-Objekten (einschließlich
null
) gibt zurück"object"
Überprüfung ihrer Konstruktoren
Das Überprüfen ihrer
constructor
Eigenschaft gibt die Funktion mit ihren Namen zurück.Einführung in Function.name
Function.name
Gibt einen schreibgeschützten Namen einer Funktion oder"anonymous"
für Schließungen zurück.quelle
Object.create(null)
und warum würdest du das überhaupt tun ...?OK, lassen Sie uns dieses Konzept zuerst geben, bevor Sie Ihre Frage beantworten. In JavaScript sind die Funktionen Objekt, auch Null, Objekt, Arrays und sogar Datum. Wie Sie sehen, gibt es also keinen einfachen Weg wie typeof obj === 'object' Alles, was oben erwähnt wurde, gibt true zurück , aber es gibt Möglichkeiten, dies durch Schreiben einer Funktion oder Verwenden von JavaScript-Frameworks zu überprüfen. OK:
Stellen Sie sich nun vor, Sie haben dieses Objekt, das ein reales Objekt ist (nicht null oder Funktion oder Array):
Reines JavaScript:
oder
oder
oder
Sie können einfach eine dieser Funktionen wie oben in Ihrem Code verwenden, indem Sie sie aufrufen. Wenn es sich um ein Objekt handelt, wird true zurückgegeben:
Wenn Sie ein JavaScript-Framework verwenden, haben diese normalerweise diese Art von Funktionen für Sie vorbereitet. Dies sind nur einige davon:
jQuery:
Winkel:
Unterstrich und Lodash:
quelle
Es kommt darauf an, was du mit "ist ein Objekt" meinst. Wenn Sie alles wollen, was nicht primitiv ist , dh Dinge, für die Sie neue Eigenschaften festlegen können, sollte dies den Trick tun:
Ausgeschlossen sind die Grundelemente (ganze Zahlen /
NaN
/Infinity
, blanke Saiten, Symbole,true
/false
,undefined
undnull
) sollte aber für alles andere true zurück (einschließlichNumber
,Boolean
undString
Objekte). Beachten Sie, dass JS nicht definiert, welche "Host" -Objekte, wie z. B.window
oderconsole
, bei Verwendung mit zurückgegeben werden sollentypeof
, sodass diese mit einer solchen Prüfung nur schwer abgedeckt werden können.Wenn Sie wissen möchten, ob etwas ein "einfaches" Objekt ist, dh es wurde als Literal
{}
oder mit erstelltObject.create(null)
, können Sie Folgendes tun:Bearbeiten 2018 : Da
Symbol.toStringTag
jetzt das Anpassen der Ausgabe von möglich istObject.prototype.toString.call(...)
, kann dieisPlainObject
obige Funktionfalse
in einigen Fällen zurückgegeben werden, selbst wenn das Objekt sein Leben als Literal begann. Konventionell ist ein Objekt mit einem benutzerdefinierten String-Tag wohl kein einfaches Objekt mehr, aber dies hat die Definition dessen, was ein einfaches Objekt überhaupt in Javascript ist, weiter getrübt.quelle
instanceof Object
, zwei identische Funktionsliterale sind nicht streng gleich, sie werden als Referenz übergeben usw.Mein Gott, zu viel Verwirrung in anderen Antworten.
Kurze Antwort
typeof anyVar == 'object' && anyVar instanceof Object && !(anyVar instanceof Array)
Um dies zu testen, führen Sie einfach die folgenden Anweisungen in der Chrome-Konsole aus.
Fall 1.
Fall 2.
Fall 3.
Erläuterung
Okay. Lass es uns zusammenfassen
typeof anyVar == 'object'
wird von drei Kandidaten als wahr zurückgegeben -[], {} and null
,anyVar instanceof Object
schränkt diese Kandidaten auf zwei ein -[], {}
!(anyVar instanceof Array)
verengt sich auf nur einen -{}
Trommelwirbel bitte!
Auf diese Weise haben Sie möglicherweise bereits gelernt, wie Sie in Javascript nach Arrays suchen.
quelle
false
(wie gewünscht) zurückgegeben wird, wennanyVar
es sich um eine Funktion handelt.Der vernünftigste Weg, den Typ eines Wertes zu überprüfen, scheint der
typeof
Operator zu sein. Das einzige Problem ist, dass es schrecklich kaputt ist:"object"
für zurückgegebennull
, was zum Typ Null gehört."function"
für aufrufbare Objekte zurückgegeben, die zum Objekttyp gehören."unknown"
. Die einzigen verbotenen Ergebnisse sind"function"
primitive Typen.typeof
ist nur für Nichtprimitive zuverlässignull
. Eine Möglichkeit, um zu überprüfen, ob ein Wert ein Objekt ist, besteht darin, sicherzustellen, dass die von zurückgegebene Zeichenfolgetypeof
keinem Grundelement entspricht und das Objekt nichtnull
. Das Problem ist jedoch, dass ein zukünftiger Standard einen neuen primitiven Typ einführen könnte, und unser Code würde ihn als Objekt betrachten. Neue Typen werden nicht häufig angezeigt, aber beispielsweise hat ECMAScript 6 den Symboltyp eingeführt.Daher
typeof
empfehle ich stattdessen nur Ansätze, deren Ergebnis davon abhängt, ob der Wert ein Objekt ist oder nicht. Das Folgende soll ein seinUmfassende, aber nicht erschöpfende Liste geeigneter Methoden zum Testen, ob ein Wert zum Objekttyp gehört.
Object
KonstrukteurDer
Object
Konstruktor erzwingt das übergebene Argument für ein Objekt. Wenn es sich bereits um ein Objekt handelt, wird dasselbe Objekt zurückgegeben.Daher können Sie damit den Wert eines Objekts erzwingen und dieses Objekt streng mit dem ursprünglichen Wert vergleichen.
Die folgende Funktion erfordert ECMAScript 3, das eingeführt wurde
===
:Ich mag diesen Ansatz, weil er einfach und selbstbeschreibend ist und eine analoge Prüfung auch für Boolesche Werte, Zahlen und Zeichenfolgen funktioniert. Beachten Sie jedoch, dass das Globale
Object
weder beschattet noch verändert wird.Konstruktoren
Wenn Sie einen Konstruktor instanziieren, kann er einen anderen Wert als die gerade erstellte Instanz zurückgeben. Dieser Wert wird jedoch ignoriert, es sei denn, es handelt sich um ein Objekt.
Die folgende Funktion erfordert ECMAScript 3, mit dem Konstruktoren Nichtobjekte zurückgeben können. Vor ECMAScript 3 gab es einen Fehler, aber
try
Anweisungen gab es damals noch nicht.Dieses Beispiel ist zwar etwas weniger einfach als das vorherige, es basiert jedoch nicht auf einer globalen Eigenschaft und ist daher möglicherweise die sicherste.
this
WertBei alten ECMAScript-Spezifikationen musste der
this
Wert ein Objekt sein. Einführung von ECMAScript 3Function.prototype.call
, mit dem eine beliebige Funktion aufgerufen werden konntethis
Wert , aber zu einem Objekt gezwungen werden konnte.ECMAScript 5 führte einen strengen Modus ein, der dieses Verhalten beseitigte, aber im schlampigen Modus können wir uns immer noch darauf verlassen (sollten es aber wohl nicht).
[[Prototyp]]
Alle gewöhnlichen Objekte haben einen internen Steckplatz namens [[Prototype]], dessen Wert bestimmt, von welchem anderen Objekt sie erben. Der Wert kann nur ein Objekt sein oder
null
. Daher können Sie versuchen, ein Objekt zu erstellen, das vom gewünschten Wert erbt, und prüfen, ob es funktioniert hat.Beides
Object.create
undObject.getPrototypeOf
erfordern ECMAScript 5.Einige neue ECMAScript 6-Möglichkeiten
ECMAScript 6 führt einige neue indirekte Methoden ein, um zu überprüfen, ob ein Wert ein Objekt ist. Sie verwenden den zuvor gesehenen Ansatz, um den Wert an einen Code zu übergeben, für den ein Objekt erforderlich ist, das in eine
try
Anweisung eingeschlossen ist, um Fehler abzufangen. Einige versteckte Beispiele, die es nicht wert sind, kommentiert zu werdenCode-Snippet anzeigen
Code-Snippet anzeigen
Hinweis: Ich habe absichtlich einige Ansätze wie
Object.getPrototypeOf(value)
(ES5) undReflect
Methoden (ES6) übersprungen, weil sie wesentliche interne Methoden aufrufen, die böse Dinge tun können, z. B. wennvalue
es sich um einen Proxy handelt. Aus Sicherheitsgründen beziehen sich meine Beispiele nur,value
ohne direkt darauf zuzugreifen.quelle
Versuche dies
quelle
Object.prototype instanceof Object
-> false.Object.create(null) instanceof Object
-> falsch.new Date() instanceof Object
=> trueGebrauchsfertige Funktionen zur Überprüfung
Erläuterung
In Javascript,
null
,Object
,Array
,Date
undfunction
s sind alle Objekte. Obwohlnull
ist etwas erfunden. Es ist also besser, nach demnull
ersten zu suchen, um festzustellen, dass es nicht null ist.Überprüfung auf
typeof o === 'object'
Garantien,o
die ein Objekt sind. Ohne diese PrüfungObject.prototype.toString
wäre es bedeutungslos, da es Objekt für alles zurückgeben würde, auch fürundefined
undnull
! Zum Beispiel:toString(undefined)
kehrt zurück[object Undefined]
!Nach der
typeof o === 'object'
Prüfung wird toString.call (o) eine große Methode zu prüfen , obo
ein Objekt ist, ein abgeleitetes Objekt wieArray
,Date
oder einfunction
.In der
isDerivedObject
Funktion wird geprüft, ob es sich umo
eine Funktion handelt. Denn auch ein Objekt funktionieren, deshalb ist es da. Wenn dies nicht der Fall ist, wird die Funktion als false zurückgegeben. Beispiel:isDerivedObject(function() {})
würde zurückkehrenfalse
, aber jetzt kehrt es zurücktrue
.Man kann jederzeit die Definition eines Objekts ändern. Man kann diese Funktionen also entsprechend ändern.
Tests
quelle
Wenn Sie prüfen möchten, ob das
prototype
für einobject
ausschließlich von kommtObject
. FiltertString
,Number
,Array
,Arguments
etc.Oder als Pfeilfunktion mit einem Ausdruck (ES6 +)
quelle
return Object.prototype.toString.call(n) === '[object Object]'
null
Scheck auch entfernen , weilObject.prototype.toString.call(null) === '[object Null]'
Ich wurde gebeten, weitere Details anzugeben. Die sauberste und verständlichste Methode, um zu überprüfen, ob unsere Variable ein Objekt ist, ist
typeof myVar
. Es gibt eine Zeichenfolge mit einem Typ zurück (z"object"
."undefined"
).Leider haben entweder Array und null auch einen Typ
object
. Um nur reale Objekte aufzunehmen, muss die Vererbungskette mit deminstanceof
Operator überprüft werden . Es wird null eliminiert, aber Array hat Object in der Vererbungskette.Die Lösung lautet also:
quelle
/./ instanceof Object //true
Wenig spät ... für "einfache Objekte" (ich meine, wie {'x': 5, 'y': 7}) habe ich diesen kleinen Ausschnitt:
Es wird die nächste Ausgabe generiert:
Es funktioniert immer bei mir. If gibt nur dann "true" zurück, wenn der Typ "o" "object" ist, aber keine Null, kein Array oder keine Funktion. :) :)
quelle
lodash hat isPlainObject , nach dem viele suchen, die auf diese Seite kommen. Es gibt false zurück, wenn eine Funktion oder ein Array angegeben wird.
quelle
_.isObject
welche Übereinstimmungen das sind, was JS als Objekt betrachtet. Normalerweise muss ich jedoch zwischen einem Objektliteral und einem Array unterscheiden, und genau das kann_.isPlainObject
ich tun.Das wird funktionieren. Es ist eine Funktion, die true, false oder möglicherweise null zurückgibt.
quelle
null
eher als Ergebnis für den endgültigen Test als erhaltenfalse
. Siehe Wann sollte ich Änderungen am Code vornehmen?Da es eine Menge Verwirrung darüber zu geben scheint, wie dieses Problem richtig behandelt werden soll, lasse ich meine 2 Cent (diese Antwort ist spezifikationskonform und liefert unter allen Umständen korrekte Ergebnisse):
Testen auf Grundelemente:
undefined
null
boolean
string
number
Ein Objekt ist kein Primitiv:
Oder alternativ:
Testen für jedes Array:
Testen auf Objekte ohne:
Date
RegExp
Boolean
Number
String
Function
beliebiges Arrayquelle
Wenn alles andere fehlschlägt, benutze ich Folgendes:
quelle
item.constructor === Object
?null
wirft eine AusnahmeUncaught TypeError: Cannot read property 'constructor' of null(…)
indexOf
oder wegenconstructor.name
?Die Ramda- Funktionsbibliothek bietet eine wunderbare Funktion zum Erkennen von JavaScript-Typen.
Die volle Funktion umschreiben :
Ich musste lachen, als mir klar wurde, wie einfach und schön die Lösung war.
Anwendungsbeispiel aus der Ramda- Dokumentation :
quelle
Nach der Lektüre und vielen Implementierungen auszuprobieren, habe ich bemerkt , dass nur sehr wenige Menschen für Werte zu überprüfen versuchen , wie
JSON
,Math
,document
oder Gegenstände , die mit Prototypen Ketten länger als 1 Schritt.Anstatt die
typeof
Variable zu überprüfen und dann Randfälle wegzuhacken, dachte ich, es wäre besser, wenn die Überprüfung so einfach wie möglich gehalten wird, um zu vermeiden, dass eine Umgestaltung erforderlich ist, wenn neue Grundelemente oder native Objekte hinzugefügt werden, die sich alstypeof
'Objekt' registrieren '.Schließlich
typeof
sagt Ihnen der Operator, ob etwas ein Objekt für JavaScript ist , aber die JavaScript-Definition eines Objekts ist für die meisten realen Szenarien (ztypeof null === 'object'
. B. ) zu weit gefasst . Im Folgenden finden Sie eine Funktion, die bestimmt, ob eine Variablev
ein Objekt ist, indem im Wesentlichen zwei Überprüfungen wiederholt werden:v
ist'[object Object]'
.Ich wollte, dass das Ergebnis der Funktion genau den folgenden Protokollen entspricht, daher ist dies die einzige "Objektivität" -Kriterium, mit der ich am Ende endete. Wenn dies fehlschlägt, gibt die Funktion sofort false zurück.
v
wird durch den nächsten Prototyp in der Kette mit ersetztv = Object.getPrototypeOf(v)
, aber auch direkt danach ausgewertet. Wenn der neue Wert vonv
istnull
, bedeutet dies, dass jeder Prototyp einschließlich des Root-Prototyps (der sehr wohl der einzige Prototyp innerhalb der Kette gewesen sein könnte) die Prüfung in der while-Schleife bestanden hat und wir true zurückgeben können. Andernfalls wird eine neue Iteration gestartet.quelle
quelle
value
ist,null
wird ein Fehler ausgegeben ...false
für das Objekt seinObject.assign({}, {constructor: null})
.Wenn Sie explizit überprüfen möchten, ob der angegebene Wert ist
{}
.quelle
!!obj
ist eine Abkürzung für die Überprüfung, ob sieobj
wahr ist (um herauszufilternnull
)quelle
Es ist eine alte Frage, aber ich dachte, ich lasse das hier. Die meisten Leute prüfen, ob die Variable
{}
ein Schlüssel-Wert-Paar bedeutet und nicht, welches Unterstreichungskonstrukt JavaScript für eine bestimmte Sache verwendet, denn um ehrlich zu sein, ist meistens alles in JavaScript ein Objekt. Also das aus dem Weg räumen. Wenn Sie tun...In den meisten Fällen möchten wir wissen, ob ein Ressourcenobjekt von einer API oder unser Datenbankaufruf vom ORM zurückgegeben wurde. Wir können dann testen, ob es kein
Array
ist, nichtnull
ist, kein Typ'function'
ist und ein istObject
quelle
true
fürnew Date()
new Date()
Was ich gerne benutze, ist dies
Ich denke, in den meisten Fällen muss ein Datum die Prüfung als Objekt bestehen, daher filtere ich keine Daten heraus
quelle
Ich habe einen "neuen" Weg gefunden, um genau diese Art der Typprüfung anhand dieser SO-Frage durchzuführen: Warum gibt instanceof für einige Literale false zurück?
Daraus habe ich eine Funktion zur Typprüfung wie folgt erstellt:
dann kannst du einfach machen:
Dies wird auf Chrome 56, Firefox 52, Microsoft Edge 38, Internet Explorer 11 und Opera 43 getestet
Bearbeiten:
Wenn Sie auch überprüfen möchten, ob eine Variable null oder undefiniert ist, können Sie dies stattdessen verwenden:
Update von inancs Kommentar: Herausforderung angenommen: D.
Wenn Sie Vergleichsobjekte verlieren möchten, können Sie Folgendes versuchen:
Auf diese Weise können Sie genau wie inancs Kommentar vorgehen:
oder
quelle
instanceof
nach Objekten suchen. Dies ist jedoch keine exakte Wissenschaft.new Foo()
einFoo
Objekt zurückgeben können, genauso wie Sienew String()
einString
Objekt zurückgeben odernew Date()
einDate
Objekt zurückgeben.Foo = function(){}; isVarTypeOf(new Foo(), Foo);