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?
Tun Sie dies nicht object.hasOwnProperty(key))
. Das ist wirklich schlecht, weil diese Methoden durch Eigenschaften des betreffenden Objekts überschattet werden können - siehe { hasOwnProperty: false }
- oder, das Objekt kann ein Null-Objekt sein (Object.create(null))
.
Der beste Weg ist Object.prototype.hasOwnProperty.call(object, key)
oder:
const has = Object.prototype.hasOwnProperty; // Cache the lookup once, in module scope.
console.log(has.call(object, key));
/* Or */
import has from 'has'; // https://www.npmjs.com/package/has
console.log(has(object, key));
Ich stimme dieser Methode zu, und sie sollte die akzeptierte Antwort sein, da sie die sicherste Methode ist und gleichzeitig die Leistung aufrechterhält! eslint.org/docs/rules/no-prototype-builtins sagt: "Zum Beispiel wäre es für einen Webserver unsicher, JSON-Eingaben von einem Client zu parsen und hasOwnProperty direkt auf dem resultierenden Objekt aufzurufen, da ein böswilliger Client einen JSON-Wert wie {"hasOwnProperty": 1} senden und den Server zum Absturz bringen."
Sie können auch Folgendes verwenden die ES6 Reflect
Objekt :
x = {'key': 1};
Reflect.has( x, 'key'); // returns true
Dokumentation auf MDN für Reflect.has
kann gefunden werden aquí .
Die statische
Reflect.has()
Methode funktioniert wie die in Betreiber als eine Funktion.
OK, es sieht so aus, als hätte ich die richtige Antwort, es sei denn, Sie wollen keine vererbten Eigenschaften:
if (x.hasOwnProperty('key'))
Hier sind einige weitere Optionen für die Einbeziehung von geerbten Eigenschaften:
if (x.key) // Quick and dirty, but it does the same thing as below.
if (x.key !== undefined)
Eine weitere relativ einfache Möglichkeit ist die Verwendung von Object.keys
. Dies gibt eine array
was bedeutet, dass Sie alle Funktionen eines Arrays erhalten.
var noInfo = {};
var info = {something: 'data'};
Object.keys(noInfo).length //returns 0 or false
Object.keys(info).length //returns 1 or true
Wir leben zwar in einer Welt mit großartiger Browserunterstützung. Da diese Frage schon so alt ist, dachte ich, ich füge dies hinzu: Dies ist sicher zu verwenden ab JavaScript v1.8.5 .
Richtig, aber was wäre, wenn Sie wissen wollten, ob eine Information eine Eigenschaft mit dem Namen "someotherthing" hat? Ich denke, das ist es, wonach OP sucht.
Was ist "JS v1.8.5" ? "JavaScript v1.8.5"*? Es scheint keine Übereinstimmung zu geben mit ECMAScript Version (Version 8 wurde 2017 veröffentlicht). jQuery 1.8 wurde im Jahr 2012 veröffentlicht.
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
.