Wie überprüfe ich, ob ein Objekt eine bestimmte Eigenschaft in JavaScript hat?
Erwägen:
x = {'key': 1};
if ( x.hasOwnProperty('key') ) {
//Do this
}
Ist das der beste Weg, es zu tun?
javascript
sheats
quelle
quelle
in
undhasOwnProperty
kam für mich viel langsamer heraus als die anderen (98% langsamer). Ich bin nicht überraschthasOwnProperty
, langsamer zu sein, aber ich bin überraschtin
.Antworten:
Ich bin wirklich verwirrt von den Antworten, die gegeben wurden - die meisten von ihnen sind einfach völlig falsch. Natürlich können Sie Objekteigenschaften haben, die undefinierte, null oder falsche Werte haben. Wenn Sie also einfach die Immobilienprüfung auf
typeof this[property]
oder, noch schlimmer, reduzierenx.key
, erhalten Sie völlig irreführende Ergebnisse.Es kommt darauf an, wonach Sie suchen. Wenn Sie wissen möchten, ob ein Objekt physisch eine Eigenschaft enthält (und nicht von irgendwo oben in der Prototypenkette stammt), dann
object.hasOwnProperty
ist dies der richtige Weg. Alle modernen Browser unterstützen dies. (Es fehlte in älteren Versionen von Safari - 2.0.1 und älter - aber diese Versionen des Browsers werden selten mehr verwendet.)Wenn Sie suchen, ob ein Objekt eine Eigenschaft enthält, die iterierbar ist (wenn Sie über die Eigenschaften des Objekts iterieren, wird es angezeigt), gehen Sie wie folgt vor:
prop in object
Sie erhalten den gewünschten Effekt.Da die Verwendung
hasOwnProperty
wahrscheinlich das ist, was Sie möchten, und wenn Sie bedenken, dass Sie möglicherweise eine Fallback-Methode wünschen, präsentiere ich Ihnen die folgende Lösung:Das Obige ist eine funktionierende, browserübergreifende Lösung für
hasOwnProperty
eine Einschränkung: Es kann nicht zwischen Fällen unterschieden werden, in denen sich eine identische Eigenschaft im Prototyp und in der Instanz befindet - es wird lediglich davon ausgegangen, dass sie vom Prototyp stammt. Sie könnten es je nach Ihrer Situation milder oder strenger gestalten, aber zumindest sollte dies hilfreicher sein.quelle
var w = opts.w || 100;
. Wenn Sie sich jedoch in einer Bibliothek befinden, müssen Sie an einigen Stellen möglicherweise etwas weiter gehen.__proto__
auf Null? Einfaches Impl:function hasOwnProperty(obj, prop) { var temp = obj.__proto__; obj.__proto__ = null; var ret = prop in obj; obj.__proto__ = temp; return ret; }
(Fall mitobj.constructor.prototype
sollte hinzugefügt werden).__proto__
ist nicht Standard und funktioniert in einigen älteren Browsern nicht. Und selbst mit dem kürzlich hinzugefügtenObject.getPrototypeOf
Standard können Sie den Prototyp eines vorhandenen Objekts immer noch nicht ändern.for(prop in object)
Schleife iteriert nur aufzählbare Eigenschaften.prop in object
Überprüft jedoch, obobject
die Eigenschaftprop
irgendwo in der prototypischen Kette vorhanden ist, unabhängig davon, ob sie aufzählbar ist oder nicht.Mit
Underscore.js
oder ( noch besser )lodash
:Welche Aufrufe
Object.prototype.hasOwnProperty
, aber (a) ist kürzer zu tippen, und (b) verwendet "einen sicheren Verweis aufhasOwnProperty
" (dh es funktioniert auch wennhasOwnProperty
überschrieben wird).Insbesondere definiert lodash
_.has
als:quelle
npm install lodash.has
ein npm-Modul mit nur einerhas
Funktion verfügbar machen, die bei Minimierung bis zu 175 Byte kompiliert. Es ist auch aufschlussreich, sich anzusehenlodash.has/index.js
, wie eine sehr beliebte und vertrauenswürdige Bibliothek funktioniert.lodash
's Versionen funktionieren damit:.has(undefined, 'someKey') => false
während derunderscore
Rückkehrundefined
lodash
als "noch eine weitere" Abhängigkeit hinzuzufügen : Es ist eine ziemlich häufige (wenn nicht DIE häufigste) Bibliothek für diese Art von Dingen. Viel Spaß beim Erfinden des Rades.Wie wäre es mit?
quelle
in
Operator verwenden sollte oder nicht. Beachten Sie auch, dass derin
Operator eine hervorragende Browserunterstützung hatIE 5.5+, Chrome 1.0+, Firefox 1.0+, Safari 3.0+
stackoverflow.com/questions/2920765/…in
prüft auch die Prototyp-Eigenschaften, während nurhasOwnProperty
benutzerdefinierte Eigenschaften iteriert werden. Referenz: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…'key' in x
tun Arbeit mit Arrays. Beweis: stackoverflow.com/questions/33592385/…Hinweis : Folgendes ist heutzutage dank des strengen Modus und weitgehend veraltet
hasOwnProperty
. Die richtige Lösung besteht darin, den strengen Modus zu verwenden und mithilfe von das Vorhandensein einer Eigenschaft zu überprüfenobj.hasOwnProperty
. Diese Antwort ist älter als diese beiden Dinge, mindestens so weit verbreitet (ja, es ist so alt). Nehmen Sie das Folgende als historische Notiz.Beachten Sie, dass dies
undefined
(leider) kein reserviertes Wort in JavaScript ist, wenn Sie nicht den strengen Modus verwenden. Daher könnte jemand (offensichtlich jemand anderes) die großartige Idee haben, es neu zu definieren und Ihren Code zu brechen.Eine robustere Methode ist daher die folgende:
Auf der anderen Seite ist diese Methode viel ausführlicher und auch langsamer. : - /
Eine gemeinsame Alternative ist , um sicherzustellen , dass
undefined
ist eigentlich nicht definiert, zB indem Sie den Code in eine Funktion setzen , die einen zusätzlichen Parameter akzeptiert, genanntundefined
, die keinen Wert übergeben wird. Um sicherzustellen, dass kein Wert übergeben wird, können Sie ihn sofort selbst aufrufen, z.quelle
void 0
definiert ist, um das Kanonische zurückzugebenundefined
, könnte man tunx.attribute !== void 0
?(function (undefined) { // undefined is actually undefined here })();
Armin Ronacher scheint mich schon geschlagen zu haben , aber:
Eine sicherere, aber langsamere Lösung, wie von Konrad Rudolph und Armin Ronacher hervorgehoben, wäre:
quelle
x.hasOwnProperty('toString') === true;
Object.prototype
hat schon eine eingebaute, korrektehasOwnProperty
. Das Überschreiben mit einer falschen Implementierung (1. Eigenschaften können den Wert habenundefined
, 2. Dies führt zu falsch positiven Ergebnissen für geerbte Eigenschaften) ist nur eine schrecklich schlechte Idee. Falsche Antworten können und sollten gelöscht werden. Ich weiß nicht, ob Sie das im September 2008 tun könnten, als Sie Resigs Antwort sahen , also kommentieren Sie, um vorzuschlagen, es jetzt zu tun.Mit dem
in
Operator können Sie überprüfen, ob die Eigenschaft für ein Objekt vorhanden ist:Sie können auch alle Eigenschaften des Objekts mithilfe einer Schleife durchlaufen
for - in
und dann nach der spezifischen Eigenschaft suchen:Sie müssen berücksichtigen, ob diese Objekteigenschaft aufzählbar ist oder nicht, da nicht aufzählbare Eigenschaften nicht in einer
for-in
Schleife angezeigt werden. Wenn die Eigenschaft enumerable eine nicht aufzählbare Eigenschaft des Prototyps überschattet, wird sie in Internet Explorer 8 und früheren Versionen nicht angezeigt .Wenn Sie eine Liste aller Instanzeigenschaften wünschen, ob aufzählbar oder nicht, können Sie verwenden
Dies gibt ein Array von Namen aller Eigenschaften zurück, die für ein Objekt vorhanden sind.
Schließlich können Sie den Operator typeof verwenden, um den Datentyp der Objekteigenschaft direkt zu überprüfen:
Wenn die Eigenschaft für das Objekt nicht vorhanden ist, wird die Zeichenfolge undefiniert zurückgegeben. Andernfalls wird der entsprechende Eigenschaftstyp zurückgegeben. Beachten Sie jedoch, dass dies nicht immer eine gültige Methode ist, um zu überprüfen, ob ein Objekt eine Eigenschaft hat oder nicht, da Sie möglicherweise eine Eigenschaft haben, die auf undefiniert gesetzt ist. In diesem Fall verwenden Sie
typeof x.key
würde immer noch true zurückgeben (obwohl der Schlüssel noch vorhanden ist im Objekt).Update: Sie können überprüfen, ob eine Eigenschaft vorhanden ist, indem Sie sie mit der undefinierten Javascript-Eigenschaft vergleichen
Dies sollte funktionieren, es sei denn, der Schlüssel wurde speziell für
undefined
das x-Objekt festgelegtquelle
Lassen Sie uns hier einige Verwirrung beseitigen. Lassen Sie uns zunächst vereinfachen, indem wir annehmen
hasOwnProperty
bereits existiert. Dies gilt für die überwiegende Mehrheit der derzeit verwendeten Browser.hasOwnProperty
Gibt true zurück, wenn der Attributname, der an das Objekt übergeben wird, dem Objekt hinzugefügt wurde. Es ist völlig unabhängig von dem ihm zugewiesenen tatsächlichen Wert, der genau sein kannundefined
.Daher:
Jedoch:
Das Problem ist, was passiert, wenn ein Objekt in der Prototypenkette ein Attribut mit dem Wert undefined hat?
hasOwnProperty
wird dafür falsch sein, und so wird es auch sein!== undefined
. Noch,for..in
wird es noch in der Aufzählung Liste.Unter dem Strich gibt es keine browserübergreifende Möglichkeit (da Internet Explorer dies nicht verfügbar macht
__prototype__
), um festzustellen, dass eine bestimmte Kennung nicht an ein Objekt oder etwas in seiner Prototypenkette angehängt wurde.quelle
Wenn Sie nach einer Immobilie suchen, dann "NEIN". Sie wollen:
Im Allgemeinen sollte es Ihnen egal sein, ob die Eigenschaft vom Prototyp oder vom Objekt stammt oder nicht.
Da Sie jedoch in Ihrem Beispielcode 'key' verwendet haben, scheint es, als würden Sie das Objekt als Hash behandeln. In diesem Fall wäre Ihre Antwort sinnvoll. Alle Hashes-Schlüssel wären Eigenschaften im Objekt, und Sie vermeiden die zusätzlichen Eigenschaften, die der Prototyp mit sich bringt.
John Resigs Antwort war sehr umfassend, aber ich dachte, es sei nicht klar. Besonders wenn man "'prop' in obj" verwendet.
quelle
in
Betreiber eine hervorragende Browserunterstützung hatIE 5.5+, Chrome 1.0+, Firefox 1.0+, Safari 3.0+
stackoverflow.com/questions/2920765/…in
Operators ausgeführt: "Es funktioniert mit 'Objekten' im engeren Sinne, die als {} deklariert oder mit einem Konstruktor erstellt wurden. Es akzeptiert keine Arrays oder Grundelemente. Nicht, dass das OP dies erforderlich gemacht hätte, aber Einige andere Antworten präsentieren Techniken, die breiter sind (Arbeiten mit Arrays, Strings usw.) "Verwenden Sie zum Testen einfacher Objekte:
if (obj[x] !== undefined)
Wenn Sie nicht wissen, welcher Objekttyp verwendet wird:
if (obj.hasOwnProperty(x))
Alle anderen Optionen sind langsamer.
Einzelheiten
Leistungsbewertung von 100.000.000 Zyklen unter Nodejs anhand der 5 von anderen hier vorgeschlagenen Optionen:
Die Auswertung zeigt, dass wir nicht die übliche Form verwenden sollten, es sei denn, wir möchten speziell die Prototypkette des Objekts sowie das Objekt selbst überprüfen:
if (X in Obj)...
Sie ist je nach Anwendungsfall zwei- bis sechsmal langsamerFazit: Wenn Ihr Objekt nicht unbedingt ein einfaches Objekt ist und Sie vermeiden möchten, die Prototypkette des Objekts zu überprüfen und sicherzustellen, dass x direkt Obj gehört, verwenden Sie 'if (obj.hasOwnProperty (x)) ...'.
Andernfalls, wenn Sie ein einfaches Objekt verwenden und sich keine Sorgen um die Prototypkette des Objekts machen, verwenden Sie
if (typeof(obj[x]) !== 'undefined')...
ist die der sicherste und schnellste Weg.Wenn Sie ein einfaches Objekt als Hash-Tabelle verwenden und niemals etwas Versautes tun, würde ich es verwenden
if (obj[x])...
da ich es viel lesbarer finde.Habe Spaß.
quelle
Ja, das ist es :) Ich denke, Sie können auch tun,
Object.prototype.hasOwnProperty.call(x, 'key')
was auch funktionieren sollte, wennx
eine Eigenschaft namenshasOwnProperty
:)Aber das prüft auf eigene Eigenschaften. Wenn Sie überprüfen möchten, ob eine Eigenschaft vorhanden ist, die möglicherweise auch vererbt wird, können Sie diese verwenden
typeof x.foo != 'undefined'
.quelle
weil
schlägt fehl , wenn
x.key
Entschlüssen zufalse
(Beispiel für,x.key = ""
).quelle
const x = {key: undefined};
das mit dieser Lösung false zurückgibt, währendx.hasOwnProperty('key')); // true
undReflect.has(x, 'key')); // true
. Die Eigenschaft existiert tatsächlich, aber der Wert istundefined
.Sie können auch das ES6-
Reflect
Objekt verwenden :Dokumentation zu MDN für
Reflect.has
finden Sie hier .quelle
OK, es sieht so aus, als hätte ich die richtige Antwort, es sei denn, Sie möchten keine geerbten Eigenschaften:
Hier sind einige andere Optionen, um geerbte Eigenschaften einzuschließen:
quelle
var x = { key: false };
diex.key
Methode wäre falsch.Tun Sie dies nicht, es
object.hasOwnProperty(key))
ist wirklich schlecht, da diese Methoden möglicherweise durch Eigenschaften des betreffenden Objekts überschattet werden - berücksichtigen Sie{ hasOwnProperty: false }
- oder das Objekt ein Nullobjekt sein kann(Object.create(null))
.Der beste Weg ist zu tun
Object.prototype.hasOwnProperty.call(object, key)
oder:quelle
Ein anderer relativ einfacher Weg ist die Verwendung
Object.keys
. Dies gibt ein zurück,array
was bedeutet, dass Sie alle Funktionen eines Arrays erhalten.Obwohl wir uns in einer Welt mit großartiger Browserunterstützung befinden. Da diese Frage so alt ist, dachte ich, ich würde Folgendes hinzufügen: Dies ist ab JS v1.8.5 sicher zu verwenden
quelle
Object.keys(info).indexOf('someotherthing') !== -1
hasOwnProperty "kann verwendet werden, um zu bestimmen, ob ein Objekt die angegebene Eigenschaft als direkte Eigenschaft dieses Objekts hat. Im Gegensatz zum Operator in überprüft diese Methode die Prototypkette des Objekts nicht."
Wahrscheinlich möchten Sie für Ihre Frage keine hasOwnProperty verwenden, die bestimmt, ob die Eigenschaft als direkt an das Objekt selbst angehängt vorhanden ist.
Wenn Sie feststellen möchten, ob die Eigenschaft in der Prototypkette vorhanden ist, in der Sie hauptsächlich verwenden möchten, z.
Ich hoffe das hilft.
quelle
Mit dem Risiko eines massiven Downvotings ist hier eine weitere Option für einen bestimmten Fall. :) :)
Wenn Sie ein Mitglied auf ein Objekt testen möchten und wissen möchten, ob es auf etwas anderes als Folgendes festgelegt wurde:
dann können Sie verwenden:
quelle
ECMA Script 6 Lösung mit Reflect. Erstellen Sie einen Wrapper wie:
quelle
Es gibt die Methode "hasOwnProperty" für das Objekt, es wird jedoch nicht empfohlen, diese Methode direkt aufzurufen, da das Objekt manchmal null ist oder eine Eigenschaft für das Objekt vorhanden ist, z.
{ hasOwnProperty: false }
Ein besserer Weg wäre also:
quelle
Sie können die folgenden Ansätze verwenden:
Der Unterschied zwischen den folgenden Ansätzen ist wie folgt:
quelle
Sie müssen die Methode verwenden
object.hasOwnProperty(property)
. Es gibt true zurück, wenn das Objekt die Eigenschaft hat, und false, wenn das Objekt dies nicht tut.quelle
Wenn der zu überprüfende Schlüssel in einer Variablen gespeichert ist , können Sie ihn folgendermaßen überprüfen:
quelle
Warum Dinge zu kompliziert machen, wenn Sie Folgendes tun können:
Einfach und klar für die meisten Fälle ...
quelle
const objectName = { keyname: false };
, sollte es true zurückgeben, dakeyname
es eine Eigenschaft von istobjectname
. Da der Wert jedoch falsch ist, würde er mit dieser Logik false zurückgeben.