Frage

Und zwar wie funktioniert den folgenden Code:

var sup = new Array(5);
sup[0] = 'z3ero';
sup[1] = 'o3ne';
sup[4] = 'f3our';
document.write(sup.length + "<br />");

Ausgang ‚5‘ für die Länge, wenn alles, was Sie getan haben, um verschiedene Elemente gesetzt?

Mein ‚Problem‘ mit diesem Code ist, dass ich verstehe nicht, wie length Änderungen ohne getLength() oder eine setLength() Methode aufrufen. Wenn ich einen der folgenden Schritte aus:

a.length
a['length']
a.length = 4
a['length'] = 5

auf einem Nicht-Array-Objekt, verhält es sich wie ein dict / assoziative Array. Wenn ich dies tun auf dem Array-Objekt, hat es eine besondere Bedeutung. Welcher Mechanismus in JavaScript ermöglicht dies geschehen? Ist Javascript irgendeine Art von Eigentum System, das übersetzt

a.length
a['length']

in "get" Methoden und

a.length = 4
a['length'] = 5

in "Set" Methoden?

War es hilfreich?

Lösung

Alles in JavaScript ist ein Objekt. Im Falle eines Array kehrt die length Eigenschaft die Größe des internen Speicherbereich für indizierte Elemente des Arrays. Einige der Verwirrung ins Spiel kommen kann, dass die [] Operator funktioniert sowohl für numerische und String-Argumente. Für ein Array, wenn Sie es mit einem numerischen Index verwenden, gibt er / legt den Index zu erwarten sind. Wenn Sie es mit einem String verwenden, gibt er / setzt die benannte Eigenschaft auf dem Array-Objekt - es sei denn, die Zeichenfolge in einen numerischen Wert entspricht, dann ist es die indizierte Element zurückgibt. Dies liegt daran, dass in JavaScript-Array-Indizes in Zeichenfolge durch einen impliziten toString() Aufruf dazu gezwungen werden. Ehrlich gesagt, das ist nur eine weitere jener Dinge, die Sie kratzen den Kopf macht und sagen: „Sie JavaScript, um diese, das ist, warum sie dich auslachen.“

Die eigentliche zugrunde liegende Darstellung kann zwischen den Browsern unterscheiden (oder auch nicht). Ich würde nicht auf etwas anderes als die Schnittstelle verlassen, die geliefert wird, wenn mit ihm zu arbeiten.

Sie können mehr über Javascript-Arrays erfahren Sie unter MDN .

Andere Tipps

Um zu tvanfosson Antwort hinzuzufügen: In ECMA-262 (die 3.0-Spezifikation, glaube ich), Arrays wird einfach als mit diesem Verhalten definierten Eigenschaften für die Einstellung (siehe 15.4.5.1). Es gibt keinen allgemeinen Mechanismus es (zumindest ab sofort) zugrunde liegen -. Das ist billig, wie es definiert ist, und wie JavaScript-Interpreter verhalten müssen

Das hängt davon ab, was Sie vorhaben, mit ihm zu tun.

[].length ist "magisch".
Es ist nicht wirklich gibt die Anzahl der Elemente im Array. Es gibt den größten instated Index im Array.

var testArr = [];  testArr[5000] = "something";  testArr.length; // 5000

Aber die Methode hinter dem Setter wird in dem Motor selbst versteckt.
Einige Motoren in einigen Browsern geben Ihnen Zugriff auf ihre Implementierungen dieser Magie-Methoden. Andere werden alles halten vollständig gesperrt.

So verlassen sich nicht auf defineGetter und defineSetter Methoden oder sogar wirklich, __proto__ Methoden, wenn Sie wissen, welche Browser Sie wissen, Sie sind Targeting, und welche Sie nicht sind.

Dies wird sich in Zukunft ändern, wo Opt-in-Anwendungen in ECMAScript geschrieben Next / 6 erhalten Zugang zu mehr.

ECMAScript 5-kompatibele Browser beginnen bereits get zu bieten und magische Methoden in Objekten set und es gibt mehr zu kommen ... ... aber es ist wahrscheinlich eine Weile weg, bevor Sie Unterstützung für Oldie und eine Tonne von Smartphones entleeren kann, et cetera ...

Es ist wichtig, zu wissen, dass, wenn Sie tun sup['look'] = 4; Sie nicht ein assoziatives Array verwenden, sondern vielmehr Eigenschaften für das Objekt sup ändern. Er entspricht sup.look = 4; da Sie dynamisch Eigenschaften auf JavaScript-Objekte jederzeit hinzufügen können. sup['length'] würde für eine Instanz Ausgang 5 im ersten Beispiel.

Wenn Sie beabsichtigen, Objekte mit Array-ähnlichen Zugriff zu implementieren, die Array Mozilla dev Artikel ist eine großartige Ressource. Ich weiß nicht, die in der Tiefen Details der Array Implementierung Leider aber es gibt eine Menge von Details in diesem Artikel.

Array Objekt erbt caller, constructor, length und name Eigenschaften von Function.prototype .

Ein JavaScript-Array ist ein Objekt wie jedes andere Objekt, aber JavaScript gibt es eine spezielle Syntax.

arr[5] = "yo"

Die oben ist syntaktischer Zucker für

arr.insert(5,"yo")

Das ist, wie Sie Zeug zu einem regulären Objekt hinzufügen würden. Es ist, was innerhalb der ist Einsatz Methode, die den Wert von arr.length ändert

Sehen Sie meine Implementierung eines Custom Typ hier: http://jsfiddle.net/vfm3vkxy/4/

Wie andere Leute schon erwähnt haben, kann eine Eigenschaft in JavaScript grundsätzlich als sowohl als Getter wirken und einen Setter Ihres Arrays (oder String oder andere Eingänge).

Wie der Tat, können Sie diese selbst ausprobieren:

const test=[1,2,3,4,5]
test.length = 3
console.log(test) // [1,2,3]
test.length = 5
console.log(test) // guess what happens here!

Soweit ich weiß, Arrays in JS nicht funktionieren genau wie assoziative Arrays und Sie haben Elemente, die in Speicher abgelegt worden sind so zusammenhängend wie möglich (vorausgesetzt, dass Sie Arrays von gemischten Objekten haben können), abhängig von der JS-Engine Sie erwägen.

Als Randbemerkung, ich bin ein wenig verwirrt, dass die meisten Stimmen Antwort hält die Über vereinfachte Mythos (oder Halbwahrheit) Verbreitung von „alles ein Objekt in JavaScript zu sein“; , dass nicht genau wahr ist, sonst werden Sie nie Primitiven studieren, zum Beispiel.

Versuchen Sie, dies zu tun:

const pippi = "pippi"
pippi.cat = "cat"
console.log(pippi.cat) // will it work? Throw an error? Guess why again

Spoiler: die Zeichenfolge in einem Wegwerf-Objekt für die jeweilige Operation in der zweiten Zeile umgebrochen wird, dann in der folgenden, die Sie sich nur noch eine Eigenschaft der primitiven zuzugreifen, die nicht da ist (vorausgesetzt, Sie nicht mit String.prototype spielen oder dergleichen), so erhalten Sie undefined.

Merkmale eines Javascript-Array

  1. Dynamische - Arrays in Javascript dynamisch wachsen .push
  2. Kann spärlich sein - für z.B. array [50000] = 2;
  3. Kann dicht sein - für z.B. array = [1, 2, 3, 4, 5]

In Javascript, ist es schwer für die Laufzeit zu wissen, ob das Array dicht oder spärlich sein wird. Also alles, kann es tun, ist eine Vermutung nehmen. Alle Implementierungen verwenden eine Heuristik, um zu bestimmen, ob das Array dicht oder spärlich ist. Zum Beispiel kann Code in Punkt 2 oben, kann in JavaScript-Laufzeit anzuzeigen, dass dies wahrscheinlich eine Sparse-Array-Implementierung ist. Wenn das Array mit einer Anfangszahl initialisiert wird, zeigt dies könnte, dass dies wahrscheinlich eine dichte Anordnung.

Wenn die Laufzeit feststellt, dass das Array Sparse ist, wird es in einer ähnlichen Art und Weise zu einem Objekt implementiert. Anstatt also eine zusammenhängende Reihe von beibehalten wird, ein Schlüssel / Wert-Karte eingebaut ist.

Für weitere Referenz - https://www.quora.com/How-are-javascript- Arrays implementierter intern

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top