Wie prüfe ich, ob ein Objekt eine bestimmte Eigenschaft in JavaScript hat?
Bedenken Sie:
x = {'key': 1};
if ( x.hasOwnProperty('key') ) {
//Do this
}
Ist das der beste Weg?
Wie prüfe ich, ob ein Objekt eine bestimmte Eigenschaft in JavaScript hat?
Bedenken Sie:
x = {'key': 1};
if ( x.hasOwnProperty('key') ) {
//Do this
}
Ist das der beste Weg?
Betrachten Sie das folgende Objekt in Javascript
const x = {key: 1};
Sie können die in
Operator, um zu prüfen, ob die Eigenschaft auf einem Objekt existiert:
console.log("key" in x);
Sie können auch eine Schleife durch alle Eigenschaften des Objekts mit einer for - in
Schleife und suchen dann nach der spezifischen Eigenschaft:
for (const prop in x) {
if (prop === "key") {
//Do something
}
}
Sie müssen berücksichtigen, ob diese Objekteigenschaft aufzählbar ist oder nicht, denn nicht aufzählbare Eigenschaften werden nicht in einer for-in
Schleife. Wenn die aufzählbare Eigenschaft eine nicht aufzählbare Eigenschaft des Prototyps überschattet, wird sie auch nicht in Internet Explorer 8 und früher.
Wenn Sie eine Liste aller Instanzeigenschaften wünschen, ob aufzählbar oder nicht, können Sie
Object.getOwnPropertyNames(x);
Dies gibt ein Array mit den Namen aller Eigenschaften zurück, die für ein Objekt existieren.
Reflexionen bieten Methoden, die zur Interaktion mit Javascript-Objekten verwendet werden können. Die statische Reflect.has()
Methode funktioniert wie der in-Operator als Funktion.
console.log(Reflect.has(x, 'key'));
// expected output: true
console.log(Reflect.has(x, 'key2'));
// expected output: false
console.log(Reflect.has(object1, 'toString'));
// expected output: true
Schließlich können Sie den typeof-Operator verwenden, um den Datentyp der Objekteigenschaft direkt zu überprüfen:
if (typeof x.key === "undefined") {
console.log("undefined");
}
Wenn die Eigenschaft im 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 prüfen, ob ein Objekt eine Eigenschaft hat oder nicht, denn Sie könnten eine Eigenschaft haben, die auf undefiniert gesetzt ist. typeof x.key
würde immer noch true zurückgeben (auch wenn der Schlüssel noch im Objekt ist).
In ähnlicher Weise können Sie prüfen, ob eine Eigenschaft vorhanden ist, indem Sie sie direkt mit der undefined
Javascript-Eigenschaft
if (x.key === undefined) {
console.log("undefined");
}
Dies sollte funktionieren, es sei denn, der Schlüssel wurde speziell auf undefined
für das Objekt x
Lassen Sie uns hier einige Verwirrung beseitigen. Vereinfachen wir zunächst, indem wir davon ausgehen hasOwnProperty
bereits vorhanden; dies gilt für die große Mehrheit der derzeit verwendeten Browser.
hasOwnProperty
gibt true zurück, wenn der übergebene Attributname dem Objekt hinzugefügt wurde. Es ist völlig unabhängig von dem tatsächlich zugewiesenen Wert, der genau so lauten kann undefined
.
Folglich:
var o = {}
o.x = undefined
var a = o.hasOwnProperty('x') // a is true
var b = o.x === undefined // b is also true
Allerdings:
var o = {}
var a = o.hasOwnProperty('x') // a is now false
var b = o.x === undefined // b is still true
Das Problem ist, was passiert, wenn ein Objekt in der Prototypenkette ein Attribut mit dem Wert "undefiniert" hat. hasOwnProperty
wird dafür falsch sein, ebenso wie !== undefined
. Dennoch, for..in
wird es trotzdem in der Aufzählung aufgeführt.
Im Endeffekt gibt es keine browserübergreifende Möglichkeit (da der Internet Explorer keine __prototype__
), um festzustellen, dass ein bestimmter Bezeichner nicht an ein Objekt oder etwas in seiner Prototypenkette angehängt wurde.
Wenn Sie auf der Suche nach einer Immobilie sind, dann "Nein" . Sie wollen:
if ('prop' in obj) { }
Im Allgemeinen sollten Sie sich nicht darum kümmern, ob die Eigenschaft vom Prototyp oder vom Objekt stammt oder nicht.
Da Sie jedoch "key" in Ihrem Beispielcode verwendet haben, sieht es so aus, als ob Sie das Objekt als Hash behandeln, in diesem Fall würde Ihre Antwort Sinn machen. Alle Schlüssel des Hashes wären Eigenschaften des Objekts, und Sie vermeiden die zusätzlichen Eigenschaften, die der Prototyp beisteuert.
John Resig's Antwort war sehr umfassend, aber ich fand es nicht klar. Vor allem, wann man "'prop' in obj" verwenden sollte.
Beachten Sie, dass die in
Der Betreiber hat eine hervorragende Browserunterstützung IE 5.5+, Chrome 1.0+, Firefox 1.0+, Safari 3.0+
stackoverflow.com/questions/2920765/
Wie bereits in einem anderen Kommentar zur Verwendung der in
Betreiber: "Er arbeitet mit 'Objekten' im engeren Sinne, also deklariert als {} oder erstellt mit Konstruktor, er akzeptiert keine Arrays oder Primitive. Nicht, dass der OP es benötigt hätte, aber einige andere Antworten stellen Techniken vor, die breiter angelegt sind (arbeiten mit Arrays, Strings usw.)"
Ich kommentiere, weil ich zweimal kommentarlos heruntergestuft worden bin. Aber ich mag meine Antwort immer noch. Vielleicht wollte derjenige, der das getan hat, eine "umfassende" Antwort für alle Möglichkeiten, auf alle Arten von Eigenschaften zu testen Aber meine Antwort ist konzeptionell und daher kurz und bündig. Re: Adrien Be, eine nicht aufzählbare Eigenschaft ist eine, die nicht für den allgemeinen Benutzerbereich gedacht ist, also ist konzeptionell 'in' in Ordnung ;)
Zum Testen einfacher Objekte verwenden Sie:
if (obj[x] !== undefined)
Wenn Sie nicht wissen, um welchen Objekttyp es sich handelt, verwenden Sie:
if (obj.hasOwnProperty(x))
Alle anderen Optionen sind langsamer...
Eine Leistungsbewertung von 100.000.000 Zyklen unter Node.js im Vergleich zu den fünf von anderen hier vorgeschlagenen Optionen:
function hasKey1(k,o) { return (x in obj); }
function hasKey2(k,o) { return (obj[x]); }
function hasKey3(k,o) { return (obj[x] !== undefined); }
function hasKey4(k,o) { return (typeof(obj[x]) !== 'undefined'); }
function hasKey5(k,o) { return (obj.hasOwnProperty(x)); }
Die Auswertung sagt uns, dass wir nicht nur das Objekt selbst, sondern auch die Prototypenkette des Objekts überprüfen müssen, sollten wir nicht die übliche Form verwenden :
if (X in Obj)...
Je nach Anwendungsfall ist sie zwischen 2 und 6 Mal langsamer.
hasKey1 execution time: 4.51 s
hasKey2 execution time: 0.90 s
hasKey3 execution time: 0.76 s
hasKey4 execution time: 0.93 s
hasKey5 execution time: 2.15 s
Fazit: Wenn Ihr Obj nicht notwendigerweise ein einfaches Objekt ist und Sie die Überprüfung der Prototypenkette des Objekts vermeiden und sicherstellen möchten, dass x direkt zu Obj gehört, verwenden Sie if (obj.hasOwnProperty(x))...
.
Andernfalls, wenn Sie ein einfaches Objekt verwenden und sich nicht um die Prototypenkette des Objekts kümmern, können Sie mit if (typeof(obj[x]) !== 'undefined')...
ist der sicherste und schnellste Weg.
Wenn Sie ein einfaches Objekt als Hash-Tabelle verwenden und nie etwas Verrücktes tun, würde ich verwenden if (obj[x])...
weil ich sie viel lesbarer finde.
Ja, das ist es :) Ich denke, Sie können auch tun Object.prototype.hasOwnProperty.call(x, 'key')
was auch funktionieren sollte, wenn x
hat eine Eigenschaft namens hasOwnProperty
:)
Aber das testet auf eigene Eigenschaften. Wenn Sie prüfen wollen, ob es eine Eigenschaft hat, die auch vererbt werden kann, können Sie verwenden typeof x.foo != 'undefined'
.
CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.
32 Stimmen
Ich habe einen jsperf-Test mit den Antworten aller geschrieben, um zu sehen, wer am schnellsten ist: jsperf.com/wörterbuch-enthaelt-schluessel
0 Stimmen
('propertyName' in Object) ? 'Eigenschaft ist vorhanden' : 'Eigenschaft ist nicht vorhanden'
2 Stimmen
@styfle danke für den jsperf-Test.
in
yhasOwnProperty
herausgekommen Weg für mich langsamer als die anderen (98 % langsamer). Ich bin nicht überrascht überhasOwnProperty
langsamer zu sein, aber ich bin überrascht überin
.4 Stimmen
Es gibt einen neuen Vorschlag für Stufe 3,
Object.hasOwn
die einige der Probleme derObject.prototype.hasOwnProperty
.