Heim > Artikel > Web-Frontend > So initialisieren Sie schnell ein Array mit js
Tag (durch Leerzeichen getrennt): call apply
Beim Schreiben von Code besteht normalerweise die Notwendigkeit, ein Array schnell zu initialisieren. Beispielsweise benötigen wir ein Funktion von Matlab, wenn wir hier ein Array von 0-23 generieren müssen, um 24 Stunden am Tag darzustellen. zeros
Der grundlegendste Ansatz ist wie folgt:
function(){ let hours = []; for(let k = 0; k < 24; k++ ) hours.push(k); return hours; }Lassen Sie uns darüber nachdenken, wie wir ihn eleganter umsetzen können.
Erwägen Sie die Verwendung der
+ new Array(24)
-Methode, um dies zu erreichen. map
Der Code lautet wie folgt:
Array(24).map((_, h) => h);Beachten Sie, dass der zweite Parameter von
hier der Index ist, der selten verwendet wird. Hier wird der Index als numerischer Wert verwendet. map
Die Ergebnisse entsprechen nicht den Erwartungen, warum?
Nach einer kurzen Suche stellte ich fest, dass es an der Logik spärlicher Arrays in js lag.
Schauen wir uns zunächst den folgenden Code an:
let a = []; a[1000] = 2; console.log(a.length);// 1000a.forEach(x => console.log("hello"));// only one "hello"Die Verarbeitungslogik von js besteht darin, „offene Stellen“ für Positionen zu verarbeiten, denen keine aktiv zugewiesenen Werte zugewiesen sind Der Iterator wird dies nicht vergessen. Der Hauptzweck besteht darin, Fehler zu vermeiden, die durch unangemessene Zuweisungsvorgänge verursacht werden.
Angenommen, es gibt keine solche Logik und wir schreiben
, was dazu führt, dass das System ein sehr großes Array erstellt, aber tatsächlich nichts speichert. new Array(Date.now())
Wir können einfach verstehen, was
durch den folgenden Prozess bewirkt: new Array(len)
function(len){ let r = []; r.length = len; return r;Aus diesem Grund entspricht der Aufruf von
oder new Array(len)
bei map
nicht den Erwartungen. forEach
Wie kann dieses Problem gelöst werden? Zusätzlich zur Verwendung der Form von
können wir auch die Schreibmethode von new Array(len)
verwenden, um das Array zu initialisieren, aber das Schreiben auf diese Weise wird unseren Zweck, das initialisierte Array zu schreiben, nicht erreichen . new Array(1,2,3)
Zu diesem Zeitpunkt dachten wir darüber nach, dass
der zweite Parameter dieser Funktion ein Array ist, also haben wir den folgenden Code geschrieben. apply
// 借用apply Array.apply(null, Array(24)).map((_, h) => h); // [0, 1, ..., 24]Wir haben die Ergebnisse erzielt, die wir uns erhofft hatten. Dies bedeutet, dass
bei Verwendung als Parameter in Array(24)
als 24 Werte behandelt wird, da dadurch sichergestellt wird, dass die endgültige Array-Länge 24 beträgt. apply
In diesem Fall können wir natürlich auch
s Schwesterfunktion apply
verwenden. call
// 借用call Array.call(null, ...Array(24)).map((_, h) => h); // [0, 1... 23]Dies bestätigt auch eines:
Destrukturierung erhält Array(len)
-Parameter anstelle eines Parameters. Natürlich muss len
in einer Umgebung verwendet werden, die den Destrukturierungsoperator unterstützt. call
und call
vertraut gemacht haben, können wir den folgenden Code weiter schreiben: apply
// Array本身 Array(...Array(24)).map((_, h) => h); // [0, 1, ..., 24]Diese Form ist elegant genug.
Darüber hinaus stellt
in ES6
eine neue Methode Array
bereit, mit der diese „freien“ Bits gefüllt werden können, um sicherzustellen, dass nachfolgende Vorgänge reibungslos ablaufen können. fill
Der spezifische Code lautet wie folgt:
// 推荐 Array(24).fill(null).map((_, h) => h);Jetzt wird auch die letzte Schreibmethode empfohlen, diese Methode ist auch die intuitivste.
Sie müssen jedoch auf die Verwendung der
-Methode achten und versuchen, Blindfüllungen zu vermeiden, da dies zu den oben genannten Fehlern führt, die durch die „leere“ Logik von js vermieden werden sollen. fill
Wenn Sie interessiert sind, können Sie den folgenden Code ausprobieren:
// no-fillconsole.time("no-fill");let t = Array(5e7);console.timeEnd("no-fill");// fillconsole.time("fill");let q = Array(5e7).fill(null);console.timeEnd("fill");// => no-fill: 0.240ms// => fill: 3247.921msWenn Sie es im Browser versuchen, antwortet der Browser grundsätzlich nicht, um zu vermeiden, dass ein Nein angezeigt wird Ergebnisse. Unter der Annahme, dass ein int 4 Bytes Speicher belegt, belegt diese Füllung 200 MB Speicher und muss 50 Millionen Mal wiederholt werden. Dies wird zwangsläufig eine große Menge an CPU und Speicher beanspruchen, was in Single-Threaded-JS absolut nicht zulässig ist.
Das obige ist der detaillierte Inhalt vonSo initialisieren Sie schnell ein Array mit js. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!