2010-04-04 16 views
6

Zum Beispiel, wenn ich mache a [1000000] = 1; wird es Speicher für 1000000 Elemente oder nur für diesen verwenden?Sind JavaScript-Arrays assoziativ?

+0

Siehe auch: http: // stackoverflow.com/questions/1076658/javascript-array-associative-and-indexed – Pindatjuh

+4

Es scheint, dass Sie hier zwei ganz andere Fragen stellen: Ob sie assoziativ sind (im Titel) und ob sie sparse sind (im Text). Tatsächlich sind diese beiden Facetten von JS-Arrays orthogonal (d. H. Die Spärlichkeit hat nichts mit Assoziativität zu tun). – Tomalak

+1

Siehe auch: http://StackOverflow.com/questions/2039908/does-javascript-populate-empty-array-items/ – CMS

Antwort

7

Wären 1.000.000 Elemente erstellt?

Nein, Arrays sind spärlich, aber ihr Index wird persistent sein. EDIT: Eigentlich wäre ihre Spärlichkeit umsetzungsspezifisch, aber sie im Fall von a[1000000] = 1 spärlich zu halten, scheint mir eine logische Sache zu sein.

var a = [1, 2, 3, 4]; 
var x = a[1]; // -> x := 2 

delete a[1]; 
var y = a[1]; // -> y := undefined 

a[9] = 10; 
var y = a[8]; // -> z := undefined 

Sind JS assoziative Arrays?

JavaScript-Arrays sind eine Untergruppe von assoziativen Arrays (in dieser Indizes ganze Zahlen sein müssen, wie in KennyTM's answer gezeigt JavaScript-Objekte vollständig assoziativ sind.

var o = { "key1": "value1", "key2": "value2" }; 
var i = "key2"; 
var v = o[i]; // -> v := "value2" 
+1

Ob sie spärlich sind oder nicht, würde wahrscheinlich von der Implementierung abhängen. Ich würde es wagen zu erraten, dass die undefinierten Werte die dazwischen liegenden Werte initialisiert werden, um Speicher bei aktuellen Implementierungen zu erhalten. –

+0

Ich hätte erwartet, dass sie spärlich sind, um Speicher und Zeit in der 'var a [1000000] = x' Situation zu sparen. Aber das ist sehr wahrscheinlich umsetzungsspezifisch, stimme ich zu. Eine Million "undefinierter" Werte zu initialisieren, scheint eine Verschwendung von Ressourcen zu sein. – Tomalak

+0

Wenn Sie sie als Sparse-Arrays implementieren, würde dies den häufigen Fall (ohne Tausende undefinierter Werte) unnötig ineffizient machen. –

0

JS-Arrays werden automatisch wachsende Einstellung a [. 100] auf 1 auf einem leeren Array werden die ersten 99 Elemente mit „undefiniert“ bevöl

+4

Eigentlich wird nichts * ausgefüllt *. Deshalb sind nicht nur die ersten Elemente * undefiniert * (im Gegensatz zu *, die mit undefiniertem * gefüllt sind), sondern alle Elemente (außer 'a [100]') sind "undefiniert". –

+4

Um den Unterschied zu demonstrieren: 'a [1] = undefined'. Nun sind 'a.length === 2' und 'a [' 0 '] === undefined' und' a [1] === undefined', * aber * während "1" in a "wahr" ist , '0' in a 'ist' falsch '. – bobince

1

Sie Objektliteral als eine Art von ‚assoziative aray‘ in einigen Fällen verwenden kann.

var object = { 
    "first": "1", 
    "second": "2", 
    "third": "3", 
    "fourth": "4" 
}; 
object.fifth = "5"; 
object.["sixth"] = "6"; 

Aber es hat seine Grenzen ... Es gibt keine magische 'Länge' Parameter und Sie haben keinen Zugriff auf Methoden, die jedes Array hat.

8

Im ECMAScript-Standard (§ 15.4), das einzige Besondere an Array ist, dass die length Eigenschaft automatisch aktualisiert wird (und eine Reihe von Array-spezifischen Prototyp-Funktionen):

Array-Objekte geben spezielle Behandlung zu einer bestimmten Klasse von Eigenschaftsnamen. Ein Eigenschaftsname P (in Form eines String-Wertes) ist ein Arrayindex wenn und nur wenn ToString(ToUint32(P)) zu P gleich und ToUint32(P) nicht gleich 2 -1.
...
Jedes Array-Objekt hat eine length-Eigenschaft, deren Wert immer eine nichtnegative Ganzzahl kleiner als 2 ist. Der Wert der length-Eigenschaft ist numerisch größer als der Name jeder Eigenschaft, deren Name ein Array-Index ist. ...

Darüber hinaus ist ein Array nur ein Objekt, was bedeutet, dass es als assoziatives Array behandelt werden kann, although you shouldn't.


Heutzutage sollten die JS Motoren erfassen, ob die Anordnung dicht ist oder nur sehr spärlich und Schalter für eine lineare oder assoziative Array intern zwischen der Verwendung. In Ihrem Fall wird die JS-Engine keine Millionen Elemente zuweisen.

+0

+1 - Vielen Dank für den entsprechenden Abschnitt der Spezifikation zitiert. Ich werde meine Antwort entsprechend anpassen. – Tomalak

Verwandte Themen