4027 Stimmen

Prüfen, ob ein Schlüssel in einem JavaScript-Objekt existiert?

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?

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

5469voto

Ates Goral Punkte 132294

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 :

Benchmark results

325 Stimmen

Ich bin überzeugt, dass es Anwendungsfälle gibt, in denen Eigenschaften absichtlich auf undefiniert gesetzt werden.

190 Stimmen

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;

15 Stimmen

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.

380voto

rdllopes Punkte 4589

Schnelle Antwort

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.

Der langsame und zuverlässige in Betreiber und hasOwnProperty Methode

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!

Benchmark

https://jsben.ch/HaHQt

Comparing key access in JS .

Verwendung von in Betreiber

var result = "Impression" in array;

Das Ergebnis war

12,931,832 ±0.21% ops/sec      92% slower 

Verwendung von hasOwnProperty

var result = array.hasOwnProperty("Impression")

Das Ergebnis war

16,021,758 ±0.45% ops/sec     91% slower

Direkter Zugriff auf Elemente (Klammerstil)

var result = array["Impression"] === undefined

Das Ergebnis war

168,270,439 ±0.13 ops/sec     0.02% slower 

Direkter Zugriff auf Elemente (Objektstil)

var result = array.Impression  === undefined;

Das Ergebnis war

168,303,172 ±0.20%     fastest

EDIT: Was ist der Grund dafür, einer Eigenschaft die 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[].

Beratung

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.

EDIT: 12/04/2018 - NICHT MEHR RELEVANT

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.

195voto

Eli Courtwright Punkte 174547

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
}

0 Stimmen

Ja. Es gibt undefiniert zurück, ob es als Objekt oder als Array erstellt wird.

10 Stimmen

Was ist, wenn der Schlüssel existiert, der Wert aber nicht definiert ist?

20 Stimmen

Sie sollten === anstelle von == verwenden, wenn Sie mit undefiniert vergleichen, da sonst null mit undefiniert gleichgesetzt wird.

57voto

Ran Turner Punkte 8004
  1. Prüfung auf Eigenschaften des Objekts, einschließlich geerbter Eigenschaften

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
  1. Prüfung auf Eigenschaften der Objektinstanz (ohne geerbte Eigenschaften)

*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

41voto

user2320522 Punkte 371
"key" in obj

testet wahrscheinlich nur Objektattributwerte, die sich stark von Array-Schlüsseln unterscheiden

CodeJaeger.com

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.

Powered by:

X