Die Hash-Karte wird normalerweise in JavaScript als einfacher Ort zum Speichern von Schlüsselwertpaaren verwendet. Objekt ist jedoch keine echte Hash -Karte und kann möglicherweise Probleme verursachen, wenn sie unsachgemäß verwendet. Und JavaScript liefert möglicherweise keine lokale Hash-Zuordnung (zumindest nicht mit dem Browser kompatibel). Es gibt einen besseren Weg, um Objekteigenschaften zu deklarieren.
Eine einfache Implementierung von Hash -Karte:
var hashMap = { Set : function(key,value){this[key] = value}, Get : function(key){return this[key]}, Contains : function(key){return this.Get(key) == null?false:true}, Remove : function(key){delete this[key]} }Beispiel der Nutzung:
Hashmap.set ("Name", "John Smith"); HashMap.set ("Alter", 24); HashMap.get ("Name"); // John Smith Hashmap.contains ("Titel"); // false hashmap.contains ("Name"); // True Hashmap.remove ("Alter");Probleme bei der Deklaration von Mitgliedern
Dieses Problem kann auf den Vererbungsmechanismus der Objektprototypkette zurückzuführen sein. Nehmen Sie die TOString -Methode als Beispiel. Wenn der Operator verwendet wird, um festzustellen, ob das Objekt existiert:
var map = {}; 'toString' in map; // WAHRDa der Operator nach dem Objekt aus allen Prototypen ausgeht. Um dieses Problem zu lösen, können Sie die HasownProperty -Methode verwenden, um festzustellen, ob das Objekt existiert:
var map = {}; map.hasownProperty ('toString'); // FALSCHDiese Methode funktioniert sehr gut, aber wenn Sie ein Eigentum von HasownProperty definieren, kann dies problematisch sein:
var map = {}; map.hasownProperty = 'foo'; map.hasownProperty ('HasownProperty'); // TypeRrorEine schnelle Lösung dafür ist die Verwendung native Objekte.
var map = {}; map.hasownProperty = 'foo'; {}. // WAHRDiese Methode verursacht keine Probleme. Jedes Mal, wenn Sie beurteilen, ob die Eigenschaften im Objekt existieren, müssen Sie die Methoden in der Prototyp -Kette herausfiltern:
var map = {}; var has = {} .hasownProperty; für (varschlüssel in map) {if (has.call (map, key)) {// etwas tun}}Nacktes Objekt
Der Trick beim Erstellen einer echten Hash -Karte besteht darin, alle Prototypobjekte zu lösen. Wir können diesen Effekt durch Object.create erreichen
var obj = {}; // ist äquivalent zu: var obj = Object.create (Object.Prototype);Darüber hinaus ermöglicht diese Methode, den Prototyp vollständig aufzugeben und Null zum Erben direkt zu verwenden.
var map = object.create (null); mapinstanceof Object; // FalseObject.Prototype.riprototypeof (MAP); // FalseObject.getPrototypeof (MAP); // null
Diese nackten Objekte (oder Wörterbücher) sind ideal als HaSP -Karte. Da es keinen Konflikt geben wird, widersetzt es irgendwelchen Typumwandlungen, wie dies zu Fehlern führt.
var map = object.create (null); map + ""; // typeerrror: Objekt kann nicht in primitive Wert konvertiert werden
Hier gibt es keine reservierten Wörter, es ist beispielsweise für die Hash -Karte konzipiert.
var map = object.create (null); 'toString' in map; // FALSCHWenn wir weiter gehen, sind wir in Schleifen einfacher geworden, wir müssen nur die Schleife so schreiben.
var map = object.create (null); für (var key in map) {// etwas tun}Abgesehen von diesen Unterschieden unterscheidet es sich nicht von dem Schlüssel-Wert der allgemeinen Objektschlüsselwerte. Das Objekt kann serialisiert, Prototypen deklariert und vererbt werden, und die Verwendung von Kontextvariablen ist gleich.
var map = Object.create (null); Object.DefineProperties (MAP, {'foo': {value: 1, Enumerable: true}, 'bar': {value: 2, aufzählbar: false}}); map.foo; // 1map ['bar']; // 2json.stringify (map); // {"foo": 1} {}. hasownProperty.call (map, 'foo'); // True {}. PropertyISenumerable.call (MAP, 'Bar'); // FALSCHAuch die oben genannten variablen Erkennungsmethoden sind anwendbar.
var map = object.create (null); typeof map; // Objekt {}. toString.call (map); // [Objektobjekt] {}. ValueOf.call (MAP); // Objekt {}