2009-07-17 18 views
46

In Javascript, was ist der Unterschied zwischen einem Objekt und einem Hash? Wie schaffst du eins gegen das andere und warum interessiert es dich? Gibt es einen Unterschied zwischen den folgenden Codebeispielen?Unterschied zwischen einem Objekt und einem Hash?

var kid = { 
name: "juni", 
age: 1 
} 

Und:

var kid = new Object(); 
kid.name = "juni"; 
kid.age = 1; 

Und:

var kid = new Object(); 
kid["name"] = "juni"; 
kid["age"] = 1; 

Können Sie sich jedes anderen Codebeispiel soll ich zeigen?

Die Kernfrage hier ist Was ist der Unterschied zwischen einem Objekt und einem Hash?

+1

denke ich Ihre Aussage „Unterschied zwischen und Objekt und einem Hash“ soll bedeuten „Unterschied zwischen und Objekt und einem (hash)Karte". – Peter

+0

guter Punkt ... aber ist Hash nicht ein tatsächlicher Javascript-Typ? –

+7

In JavaScript gibt es keinen Hash-Typ. '{}' ist nur ein Short-Hand-Initialisierer für den 'Object'-Typ. Und '[]' ist nur ein Kurz-Hand-Initialisierer für den 'Array'-Typ. – Blixt

Antwort

48

Es gibt einfach keine. Alle drei sind buchstäblich gleich.

+14

Falsch oder zumindest eine Übervereinfachung. Es ist nicht so, dass es keinen Unterschied zwischen ihnen gibt. Sie sind eigentlich alle gleich, also ist der Unterschied nicht "0", sondern "NaN". –

+1

Und doch ... hier http://stackoverflow.com/questions/8511281/check-if-a-variable-is-an-object-in-javascript zeigen sie, dass verschiedene 'isObject' Implementierungen _could_ verschiedene Antworten geben können. –

3

Sie sind gleich.

können Sie sie austauschbar verwenden.

4

Es gibt keinen Unterschied in irgendwelchen Ihrer Proben. Sie sind alle Objekte mit benannten Eigenschaften. Sie haben gerade verschiedene Möglichkeiten zum Erstellen/Referenzieren dieser Eigenschaften angezeigt.

3

Ich denke, das ist alles gleich. Die dritte Version könnte mit dynamischen Eigenschaftsnamen verwendet werden. Der erste ist der kürzeste zu schreiben.

13

Sie sind verschiedene Notationssysteme, die Sie synonym verwenden können. Es gibt viele Situationen, in denen die Verwendung der Klammer-Syntax [ ] ansprechender sein kann, ein Beispiel wäre, wenn ein Objekt mit einer Variablen referenziert wird.

var temp = "kid"; 
var obj = new Object(); 
obj[temp] = 5; // this is legal, and is equivalent to object.kid 
obj.temp = 5; // this references literally, object.temp 
2

Sie sind gleich. Genau wie [] und new Array() sind die gleichen. Weitere Informationen zu den Kerntypen von JavaScript finden Sie in der MDC Core JavaScript 1.5 reference.

Wenn Sie nachweisen wollen, dass {} die gleiche wie new Object() ist:

Object.prototype.helloWorld = function() { alert('Foo!'); }; 
var a = new Object(); 
var b = {}; 
a.helloWorld(); 
b.helloWorld(); 

!!! WARNUNG HILFSVERSORGUNG !!! Niemals jemals der Eigenschaft des Object Produktionscodes zuweisen. Sie werden den gesamten globalen Namensraum verschmutzen.

0

Tatsächlich gibt es in JavaScript nichts, das 'hashtable' oder 'hashmap' genannt wird. Das Objekt in JavaScript verhält sich wie ein 'Hash' [Objekte in JavaScript sind einfach Schlüssel/Wert-Eigenschaften] und daher die Verwirrung.

4

Eigentlich ist jedes Objekt in JavaScript ein Hash. Dies ist ein Hash der Eigenschaften und Methoden des Objekts. Tatsächlich ist alles in Javascript ein Hash (d. H. Eine Liste von Name/Wert-Paaren).

Jedes Mal, wenn Sie die Methode, die Eigenschaft oder die Referenz eines Objekts aufrufen, führen Sie eine interne Hash-Suche durch.

+0

Um es kurz zu machen, es ist eine verallgemeinerte Map anstelle eines Hash, dass jedes Objekt in JavaScript ist. In Sprachen wie Java, C# usw. werden Karten für einen homogenen Datentyp verwendet, während in JavaScript die Daten für die "Karte" einfach heterogen sind. – lcn

5

In anderen Sprachen wie Java und C# ist es möglich, jedes Objekt (nicht nur eine Zeichenkette oder eine Zahl) als Schlüssel in einer Hashtabelle/Hash-Map zu verwenden, was in JavaScript nicht der Fall ist: Schlüssel werden einfach konvertiert zu Saiten.

var h = {}, k = {}; 
h[k] = "One"; 
alert(h[ "[object Object]" ]); // Alerts "One" 

Es kann nützlich sein, beliebige Objekte als Schlüssel zu verwenden, in dem Fall, dass Sie so etwas wie jshashtable verwenden können.

Haftungsausschluss: Ich schrieb jshashtable.

1

Technisch sind sie gleich. Wenn Sie Code schreiben, können Sie leicht myobject['someproprty' + 'somethingElseConcatenated] tun, was Sie nicht tun können, wenn Sie die "Punktnotation" verwenden - myobject.someproperty ist alles, was Sie tun können.

Douglas Crockford, einer der Autoren von ECMAscript, schlägt vor, nicht Syntax aus irgendeinem Grund zu verwenden, die ich nicht ganz fangen. Wie auch immer, es lohnt sich seine Präsentation zu beobachten, wenn Sie daran interessiert sind (es besteht aus mehreren Teilen, die erste hier http://video.yahoo.com/watch/111593/1710507 ist)

1

Jeder Motor (Browser) implementiert es anders, aber Fokus auf Chrome V8 lassen (basierend auf der Leistung Tests, die ich vor einem Jahr bei den meisten modernen Browsern durchgeführt habe, geben ähnliche Leistungssteigerungen, wenn man den v8-Richtlinien folgt).

Was passiert es im Grunde ist:

  1. Um ein dynamisches Objekt zu implementieren, auf dem Eigenschaft hinzugefügt und on the fly gelöscht werden kann - eine Hash-Tabelle ist die einfachste Lösung - aber speedwise seine nicht so effizient wie ein regelmäßiges Objekt in Java (zufälliger Zugang ...).
  2. Was V8 versucht zu raten basierend auf wenigen Strategien, wenn Ihr Objekt ein reguläres Objekt ist (hat die letzte Gruppe von Eigenschaften in einer bestimmten Reihenfolge, etc ...) oder eine Hashtabelle. Zunächst wird davon ausgegangen, dass es sich um ein einfaches Objekt handelt, und jede neue Eigenschaft bewirkt die Erstellung einer neuen Struktur eines Objekts und das Kopieren des alten Objekts darauf sowie die neue Eigenschaft. Wenn das Objekt als "schwierig" kategorisiert wird, wird es in eine Huschtabelle verschoben.
  3. Wenn V8 zu viele "Fehler" bemerkt - es verschiebt alles auf Hashtables - daher erhalten Sie schlechte Leistung (deshalb möchten Sie Konstruktoren verwenden, die alle Ihre Mitglieder oder Strukturen initiieren in einem JSON ...)

sehen Sie bitte diesen Links: https://developers.google.com/v8/design#prop_access

www.quora.com/Are-JavaScript-Objects-implemented-as-HashTables-Is-key-value-access-O-1

jayconrod.com/posts/52/a-tour-of-v8-objektdarstellung

auch ein sehr guter Vortrag: https://www.youtube.com/watch?v=UJPdhx5zTaw

Hoffe, es hilft ...

Verwandte Themen