Wie prüfe ich, ob ein bestimmter Schlüssel in einem JavaScript-Objekt oder -Array existiert?
Wenn ein Schlüssel nicht existiert und ich versuche, auf ihn zuzugreifen, wird dann "false" zurückgegeben? Oder wird ein Fehler ausgegeben?
Wie prüfe ich, ob ein bestimmter Schlüssel in einem JavaScript-Objekt oder -Array existiert?
Wenn ein Schlüssel nicht existiert und ich versuche, auf ihn zuzugreifen, wird dann "false" zurückgegeben? Oder wird ein Fehler ausgegeben?
Die Prüfung auf Undefiniertheit ist keine genaue Methode, um zu testen, ob ein Schlüssel existiert. Was ist, wenn der Schlüssel existiert, aber der Wert ist eigentlich undefined
?
var obj = { key: undefined };
console.log(obj["key"] !== undefined); // false, but the key exists!
Sie sollten stattdessen die in
Betreiber:
var obj = { key: undefined };
console.log("key" in obj); // true, regardless of the actual value
Wenn Sie prüfen wollen, ob ein Schlüssel nicht existiert, denken Sie daran, Klammern zu verwenden:
var obj = { not_key: undefined };
console.log(!("key" in obj)); // true if "key" doesn't exist in object
console.log(!"key" in obj); // Do not do this! It is equivalent to "false in obj"
Oder, wenn Sie speziell auf Eigenschaften der Objektinstanz (und nicht auf geerbte Eigenschaften) testen wollen, verwenden Sie hasOwnProperty
:
var obj = { key: undefined };
console.log(obj.hasOwnProperty("key")); // true
Für den Leistungsvergleich zwischen den Methoden, die in
, hasOwnProperty
und der Schlüssel ist undefined
siehe diese Benchmark :
Ich bin überzeugt, dass es Anwendungsfälle gibt, in denen Eigenschaften absichtlich auf undefiniert gesetzt werden.
Gültiger Anwendungsfall: Gecko 1.9.1 [Firefox 3.5] hat keine window.onhashchange-Eigenschaft. In Gecko 1.9.2 [Firefox 3.6] ist diese Eigenschaft auf undefiniert gesetzt (bis sich der Hash ändert). Um die Hash-Historie oder die Browser-Version zu erkennen, muss man window.hasOwnProperty("onhashchange") verwenden;
Zufällige Tatsache: Eigenschaften, die auf undefined
wird nicht serialisiert durch JSON.stringify(...)
in der Erwägung, dass null
tut. Also alles, was auf undefined
der in JSON umgewandelt wird, verschwindet einfach. Sie können auch verwenden delete obj.propName
um eine Eigenschaft aus einem Objekt zu entfernen.
Wie prüfe ich, ob ein bestimmter Schlüssel in einem JavaScript-Objekt oder -Array existiert? Wenn ein Schlüssel nicht existiert und ich versuche, auf ihn zuzugreifen, wird dann false zurückgegeben? Oder wird ein Fehler ausgegeben?
Der direkte Zugriff auf eine fehlende Eigenschaft mit dem (assoziativen) Array-Stil oder dem Objekt-Stil gibt eine undefiniert konstant.
Wie hier bereits erwähnt wurde, könnte man ein Objekt mit einer Eigenschaft haben, die mit einer "undefinierten" Konstante verbunden ist.
var bizzareObj = {valid_key: undefined};
In diesem Fall müssen Sie hasOwnProperty o in Betreiber, um zu wissen, ob der Schlüssel wirklich da ist. Aber, aber zu welchem Preis?
Also, ich sage euch...
in Betreiber und hasOwnProperty sind "Methoden", die den Property-Deskriptor-Mechanismus in Javascript verwenden (ähnlich der Java-Reflection in der Sprache Java).
http://www.ecma-international.org/ecma-262/5.1/#sec-8.10
Der Typ Property Descriptor wird verwendet, um die Manipulation und Verdinglichung von benannten Eigenschaftsattributen zu erklären. Werte vom Typ "Property Descriptor" sind Datensätze, die aus benannten Feldern bestehen, wobei der Name jedes Feldes ein Attributname und sein Wert ein entsprechender Attributwert gemäß 8.6.1 ist. Darüber hinaus kann jedes Feld vorhanden oder nicht vorhanden sein.
Der Aufruf einer Objektmethode oder eines Schlüssels hingegen verwendet den Javascript [[Get]]-Mechanismus. Das ist weitaus schneller!
.
var result = "Impression" in array;
Das Ergebnis war
12,931,832 ±0.21% ops/sec 92% slower
var result = array.hasOwnProperty("Impression")
Das Ergebnis war
16,021,758 ±0.45% ops/sec 91% slower
var result = array["Impression"] === undefined
Das Ergebnis war
168,270,439 ±0.13 ops/sec 0.02% slower
var result = array.Impression === undefined;
Das Ergebnis war
168,303,172 ±0.20% fastest
undefined
Wert?Diese Frage ist mir ein Rätsel. In Javascript gibt es mindestens zwei Referenzen für abwesende Objekte, um Probleme wie dieses zu vermeiden: null
y undefined
.
null
ist der primitive Wert, der die absichtliche Abwesenheit eines Objektwertes darstellt, oder kurz gesagt, der bestätigt Mangel an Wert. Andererseits, undefined
ist ein unbekannter Wert (nicht definiert). Wenn es eine Eigenschaft gibt, die später mit einem richtig Wert berücksichtigen Nutzen null
Referenz anstelle von undefined
denn im ersten Moment ist die Eigenschaft bestätigt keinen Wert zu haben.
Vergleichen Sie:
var a = {1: null};
console.log(a[1] === undefined); // output: false. I know the value at position 1 of a[] is absent and this was by design, i.e.: the value is defined.
console.log(a[0] === undefined); // output: true. I cannot say anything about a[0] value. In this case, the key 0 was not in a[].
Vermeiden Sie Objekte mit undefined
Werte. Prüfen Sie, wann immer möglich, direkt und verwenden Sie null
um Eigenschaftswerte zu initialisieren. Andernfalls verwenden Sie die langsame in
Betreiber oder hasOwnProperty()
Methode.
Wie bereits erwähnt, haben moderne Versionen der Javascript-Engines (mit Ausnahme von Firefox) den Ansatz für Zugriffseigenschaften geändert. Die aktuelle Implementierung ist für diesen speziellen Fall langsamer als die vorherige, aber der Unterschied zwischen Zugriffsschlüssel und Objekt ist vernachlässigbar.
Es wird zurückgegeben undefined
.
var aa = {hello: "world"};
alert( aa["hello"] ); // popup box with "world"
alert( aa["goodbye"] ); // popup box with "undefined"
undefined
ist ein besonderer konstanter Wert. Sie können also z.B. sagen
// note the three equal signs so that null won't be equal to undefined
if( aa["goodbye"] === undefined ) {
// do something
}
Dies ist wahrscheinlich der beste Weg, um nach fehlenden Schlüsseln zu suchen. Wie jedoch in einem Kommentar unten erwähnt, ist es theoretisch möglich, dass Sie den tatsächlichen Wert haben wollen undefined
. Ich habe das noch nie gebraucht und mir fällt aus dem Stegreif auch kein Grund ein, warum ich das jemals tun sollte, aber nur der Vollständigkeit halber: Sie können die in
Betreiber
// this works even if you have {"goodbye": undefined}
if( "goodbye" in aa ) {
// do something
}
Kann mit Hilfe des in
Operator, der true zurückgibt, wenn die angegebene Eigenschaft im angegebenen Objekt oder seiner Prototypenkette enthalten ist, andernfalls false
const person = { name: 'dan' };
console.log('name' in person); // true
console.log('age' in person); // false
*2021 - Anwendung der neuen Methode *** Object.hasOwn()
als Ersatz für Object.hasOwnProperty()
Object.hasOwn()
ist als Ersatz gedacht für Object.hasOwnProperty()
und ist eine neue Methode (die noch nicht von allen Browsern wie Safari vollständig unterstützt wird, aber bald verfügbar sein wird)
Object.hasOwn()
ist eine statische Methode, die true zurückgibt, wenn das angegebene Objekt die angegebene Eigenschaft als eigene Eigenschaft hat. Ist die Eigenschaft geerbt oder existiert sie nicht, gibt die Methode false zurück.
const person = { name: 'dan' };
console.log(Object.hasOwn(person, 'name'));// true
console.log(Object.hasOwn(person, 'age'));// false
const person2 = Object.create({gender: 'male'});
console.log(Object.hasOwn(person2, 'gender'));// false
Was ist der Grund für die Verwendung dieser Eigenschaft gegenüber Object.prototype.hasOwnProperty? - Es wird empfohlen, diese Methode über die Object.hasOwnProperty()
weil es auch für Objekte funktioniert, die mit Hilfe von Object.create(null)
und für Objekte, die die geerbte hasOwnProperty()
Methode. Obwohl es möglich ist, diese Art von Problemen zu lösen, indem man Object.prototype.hasOwnProperty()
auf ein externes Objekt, Object.hasOwn()
diese Probleme zu überwinden, wird daher bevorzugt (siehe Beispiele unten)
let person = {
hasOwnProperty: function() {
return false;
},
age: 35
};
if (Object.hasOwn(person, 'age')) {
console.log(person.age); // true - the remplementation of hasOwnProperty() did not affect the Object
}
let person = Object.create(null);
person.age = 35;
if (Object.hasOwn(person, 'age')) {
console.log(person.age); // true - works regardless of how the object was created
}
Mehr über Object.hasOwn
finden Sie hier: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/hasOwn
Browser-Kompatibilität für Object.hasOwn
- https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/hasOwn#browser_compatibility
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.
2 Stimmen
Alles (fast alles) in JavaScript ist ein Objekt oder kann in ein Objekt umgewandelt werden. Dies ist, wo pseudo-assoziative Arrays sind geboren, wie @PatrickM wies darauf hin.
0 Stimmen
Dieser Benchmark jsben.ch/#/WqlIl gibt Ihnen einen Überblick über die gebräuchlichsten Methoden, um diese Prüfung zu erreichen.
4 Stimmen
Eine schnelle Abhilfe, normalerweise wähle ich
property.key = property.key || 'some default value'
nur für den Fall, dass ich möchte, dass dieser Schlüssel mit einem Wert versehen ist