schnelle Antwort
Wie überprüfe ich, ob ein bestimmter Schlüssel in einem JavaScript-Objekt oder -Array vorhanden ist? Wenn ein Schlüssel nicht vorhanden ist und ich versuche, darauf zuzugreifen, wird er dann false zurückgeben? Oder einen Fehler werfen?
Wenn Sie direkt auf eine fehlende Eigenschaft mit einem (assoziativen) Array- oder Objektstil zugreifen, wird eine undefinierte Konstante zurückgegeben.
Der langsame und zuverlässig in Operator und hasOwnProperty Verfahren
Wie bereits erwähnt, können Sie ein Objekt mit einer Eigenschaft haben, die einer "undefinierten" Konstante zugeordnet ist.
var bizzareObj = {valid_key: undefined};
In diesem Fall müssen Sie hasOwnProperty oder in operator verwenden , um festzustellen , ob der Schlüssel wirklich vorhanden ist. Aber zu welchem Preis?
Also, ich sage dir ...
in operator und hasOwnProperty sind "Methoden", die den Property Descriptor-Mechanismus in Javascript verwenden (ähnlich der Java-Reflektion in der Java-Sprache).
http://www.ecma-international.org/ecma-262/5.1/#sec-8.10
Der Property Descriptor-Typ wird verwendet, um die Manipulation und Reifizierung benannter Eigenschaftsattribute zu erläutern. Werte vom Typ Property Descriptor sind Datensätze, die aus benannten Feldern bestehen, wobei der Name jedes Felds ein Attributname und sein Wert ein entsprechender Attributwert ist, wie in 8.6.1 angegeben. Außerdem kann jedes Feld vorhanden sein oder fehlen.
Auf der anderen Seite wird beim Aufrufen einer Objektmethode oder eines Objektschlüssels der Javascript-Mechanismus [[Get]] verwendet. Das geht viel schneller!
Benchmark
http://jsperf.com/checking-if-a-key-exists-in-a-javascript-array
.
Verwendung
im Operator
var result = "Impression" in array;
Das Ergebnis war
12,931,832 ±0.21% ops/sec 92% slower
Verwenden 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, einer Eigenschaft den undefined
Wert zuzuweisen ?
Diese Frage verwirrt mich. In Javascript gibt es mindestens zwei Referenzen für fehlende Objekte, um solche Probleme zu vermeiden: null
und undefined
.
null
ist der primitive Wert, der das absichtliche Fehlen eines Objektwerts oder kurz gesagt den bestätigten Wertmangel darstellt. Andererseits undefined
ist ein unbekannter Wert (nicht definiert). Wenn es eine Eigenschaft gibt, die später mit einem geeigneten Wert verwendet wird, ziehen Sie die Verwendung einer null
Referenz undefined
in Betracht, anstatt zu bestätigen , dass der Eigenschaft im ersten Moment ein Wert fehlt.
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[].
Beraten
Vermeiden Sie Objekte mit undefined
Werten. Überprüfen Sie dies null
nach Möglichkeit direkt und verwenden Sie es , um Eigenschaftswerte zu initialisieren. Verwenden Sie andernfalls den langsamen in
Operator oder die langsame hasOwnProperty()
Methode.
EDIT: 12/04/2018 - NICHT MEHR RELEVANT
Wie bereits erwähnt, haben moderne Versionen der Javascript-Engines (mit Firefox-Ausnahme) den Ansatz für Zugriffseigenschaften geändert. Die aktuelle Implementierung ist in diesem speziellen Fall langsamer als die vorherige, aber der Unterschied zwischen Zugriffsschlüssel und Objekt ist vernachlässigbar.