922 Stimmen

Wie initialisiert man die Länge eines Arrays in JavaScript?

Die meisten der Tutorials, die ich über Arrays in JavaScript gelesen habe (einschließlich w3-Schulen y devguru ) legen nahe, dass man ein Array mit einer bestimmten Länge initialisieren kann, indem man eine ganze Zahl an den Array-Konstruktor übergibt und die var test = new Array(4); Syntax.

Nachdem ich diese Syntax großzügig in meinen js-Dateien verwendet habe, habe ich eine der Dateien durch jsLint und er ist ausgeflippt:

Fehler: Problem in Zeile 1 Zeichen 22: Erwartet wurde ')' und stattdessen wurde '4' angezeigt.
var test = new Array(4);
Problem in Zeile 1 Zeichen 23: Erwartet wurde ';' und stattdessen wurde ')' angezeigt.
var test = new Array(4);
Problem in Zeile 1 Zeichen 23: Erwartet wurde ein Bezeichner, stattdessen wurde ')' angezeigt.

Nach dem Durchlesen jsLint's Erklärung für sein Verhalten sieht es so aus, als ob jsLint nicht wirklich die new Array() Syntax, und bevorzugt stattdessen [] bei der Deklaration von Arrays.

Ich habe also ein paar Fragen:

Erstens: Warum? Gehe ich ein Risiko ein, wenn ich die new Array() stattdessen die Syntax? Gibt es Browser-Inkompatibilitäten, die ich beachten sollte?

Und zweitens, wenn ich auf die eckige Klammer-Syntax wechseln, gibt es eine Möglichkeit, ein Array zu deklarieren und seine Länge alle in einer Zeile, oder muss ich so etwas tun:

var test = [];
test.length = 4;

1 Stimmen

standard js auch beraten gegen mit new Array() im Allgemeinen, aber es ist in Ordnung, die Größe anzugeben. Ich denke, es kommt auf die Konsistenz des Codes im gesamten Kontext an.

1 Stimmen

Für diejenigen, die starrere Array-Strukturen vorbelegen wollen, gibt es Typisierte Arrays . Beachten Sie, dass Leistungsvorteile können variieren

0 Stimmen

Bitte sehen Sie sich den folgenden Benchmark an, der verschiedene Lösungen bietet: measurethat.net/Benchmarks/Show/9721/0/

65voto

Alexander Shutau Punkte 2524

ES6 führt ein Array.from mit dem Sie eine Array von jedem "array-artig" ou Iterables Objekte:

Array.from({length: 10}, (x, i) => i);
// [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

In diesem Fall {length: 10} stellt die Minimaldefinition eines "arrayartig" Objekt: ein leeres Objekt mit nur einem length Eigenschaft definiert.

Array.from ermöglicht ein zweites Argument, um das resultierende Array zuzuordnen.

59voto

Domi Punkte 18235

Sparse Arrays sind da! [2021]

In modernen JS-Engines werden spärliche Arrays vollständig unterstützt. Sie können verwenden [] ou new Array(len) auf jede beliebige Weise, auch mit wahlfreiem Zugriff. Der Wörterbuchmodus scheint der Vergangenheit anzugehören.

In aktuellen Chrome (und ich vermute, jede V8-Umgebung), Arrays können eine Länge von bis zu 2^32-1 und Zuordnung ist sparse (was bedeutet, leere Chunks nicht verwenden Sie alle Speicher):

enter image description here

enter image description here

Allerdings gibt es einen Haken

Einerseits, for Schleifen funktionieren jedoch wie vorgesehen, Array eingebauten Funktionen höherer Ordnung (wie z.B. map , filter , find , some usw.) nicht zugewiesene Elemente ignorieren . Sie erfordern fill (oder eine andere Bevölkerungsmethode) zu wählen:

const a = new Array(10);
const b = new Array(10).fill(0);

a.forEach(x => console.log(x)); // does nothing
b.forEach(x => console.log(x)); // works as intended

Alte Version

(Ich habe das meiste aus der alten Version entfernt.) Das Wesentliche war, dass das Erstellen eines großen Arrays mit new Array(largeNumber) oder der zufällige Zugriff auf ein Array an Stellen, die noch nicht zugewiesen wurden, würde es in den "Wörterbuchmodus" versetzen. Das heißt, Sie verwenden ein Array mit Indizes, aber unter der Haube würde es ein Wörterbuch verwenden, um die Werte zu speichern, wodurch die Leistung und auch das Iterationsverhalten beeinträchtigt werden. Glücklicherweise ist das ein Ding der Vergangenheit.

30voto

Šime Vidas Punkte 172810

Dadurch wird die Eigenschaft Länge auf 4 initialisiert:

var x = [,,,,];

20voto

Haseeb Anwar Punkte 1825

Die einfachste Form ist die Verwendung von

Array.from({ length: 3 });

// gives you
[undefined, undefined, undefined]

Anders als Array(3) was zu einem Array führt, über das man nicht iterieren kann. Array.from({ length }) gibt Ihnen ein Array, das Sie leicht iterieren können.

Array.from({ length: 3 }).map((e, idx) => `hi ${idx}`);
// ['hi 1', 'hi 2', 'hi 3']

15voto

christang Punkte 533

Ich bin überrascht, dass noch keine funktionale Lösung vorgeschlagen wurde, die es Ihnen ermöglicht, die Länge in einer Zeile festzulegen. Das Folgende basiert auf UnderscoreJS:

var test = _.map(_.range(4), function () { return undefined; });
console.log(test.length);

Aus den oben genannten Gründen würde ich es vermeiden, dies zu tun, es sei denn, ich wollte das Array auf einen bestimmten Wert initialisieren. Es ist interessant zu bemerken, dass es andere Bibliotheken gibt, die range implementieren, einschließlich Lo-dash und Lazy, die unterschiedliche Leistungsmerkmale haben können.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X