2016-04-29 9 views
3

Ich dachte immer, dass Objekt in Javascript einfache Schlüssel-Wert-Paar sind, d. H. Hash-Tabellen, aber nach dem Lesen this Artikel bin ich verwirrt.Wie werden Objekte intern in V8 dargestellt?

Der Autor speziell sagt:

, wenn Sie ein Objekt, als ob es sich um eine Hash-Tabelle war, wird es in einer Hash-Tabelle gedreht werden.

Also, was zum Teufel war es vorher? speziell das ganze para hat mich verwirrt. Kann jemand etwas Licht darauf werfen?

+0

Dies ist wahrscheinlich nicht auf Programmiersprachenebene gemeint. Aber wie benutzt du die Sprache? –

+2

keine Zeit für eine vollständige Antwort, aber die JIT kann einige Objekte in Code, wo Eigenschaften nachschlagen sehr effizient fast wie C-Strukturen und es ist O (1). Außer wenn es nicht möglich ist, wenn stattdessen eine echte Hash-Tabelle als Backing Store verwendet wird. – Alnitak

Antwort

6

Nach this answer, in V8 gibt es zwei Modi kann ein Objekt Wörterbuch Modus und Fast-Modus haben-.

Objekte befinden sich ursprünglich im schnellen Modus, in dem keine Hash-Map - keine Berechnung - für den Zugriff auf Eigenschaften erforderlich ist. Es speichert Objekte wie Strukturen in C. Erst wenn Sie beginnen, ein "Objekt so zu verwenden, als wäre es eine Hash-Tabelle, wird es in einen Hash-Tabellen-Dictionary-Modus umgewandelt." Sobald dies geschieht, erhalten Sie die Leistungseinbuße einer Hash-Map, die hinter den Kulissen für den Zugriff auf Eigenschaften verwendet wird.

Zum Beispiel:

// running node with `--allow-natives-syntax` flag 

var obj = { a: true, b: false }; 
%HasFastProperties(obj); // true (Fast mode) 
delete obj.a; 
%HasFastProperties(obj); // false (Dictionary mode) 

Oder:

var obj = { a: true, b: false }; 
%HasFastProperties(obj); // true (Fast mode) 
// add lots of properties 
for (var i = 0; i < 100; i++) { 
    obj["prop" + i] = i; 
} 
%HasFastProperties(obj); // false (Dictionary mode) 

Der Grund ist es in Wörterbuchmodus geht, wenn dies zu tun eine Performance-Optimierung ist. Das Hinzufügen/Entfernen von Eigenschaften im Wörterbuchmodus ist schneller als der Schnellmodus und daher optimiert die V8-Engine die Struktur anstelle des Eigenschaftszugriffs, wenn sie dieses Verhalten erkennt (Read more here).

+0

Ist dies für eine bestimmte JavaScript-Engine spezifisch? – svick

+0

@svick yeah, nur die Antwort für den Motor der Artikel in der Frage sprach über-v8. Ich kann nicht sicher über andere Motoren sagen, weil sie das hinter den Kulissen anders handhaben könnten. –

+0

Ein guter Artikel, es besagt, dass was der Unterschied zwischen den beiden ist, meine Frage ist, ob der Fast-Modus so optimiert ist, warum brauchen wir überhaupt das Wörterbuch alias Hash-Tabellen-Modus? – CodeYogi