Heim > Web-Frontend > js-Tutorial > Hauptteil

So initialisieren Sie schnell ein Array mit js

一个新手
Freigeben: 2017-09-09 10:43:04
Original
2842 Leute haben es durchsucht

Tag (durch Leerzeichen getrennt): call apply


Hinweisversion

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. zerosDer grundlegendste Ansatz ist wie folgt:

function(){
    let hours = [];    
    for(let k = 0; k < 24; k++ )
    hours.push(k);    
    return hours;
}
Nach dem Login kopieren
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. mapDer Code lautet wie folgt:

Array(24).map((_, h) => h);
Nach dem Login kopieren
Beachten Sie, dass der zweite Parameter von

hier der Index ist, der selten verwendet wird. Hier wird der Index als numerischer Wert verwendet. mapDie 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"
Nach dem Login kopieren
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;
Nach dem Login kopieren
Aus diesem Grund entspricht der Aufruf von

oder new Array(len) bei map nicht den Erwartungen. forEachWie 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]
Nach dem Login kopieren
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. applyIn 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]
Nach dem Login kopieren
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

Nachdem wir uns mit den Prinzipien von

und call vertraut gemacht haben, können wir den folgenden Code weiter schreiben: apply

// Array本身
Array(...Array(24)).map((_, h) => h);
// [0, 1, ..., 24]
Nach dem Login kopieren
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. fillDer spezifische Code lautet wie folgt:

// 推荐
Array(24).fill(null).map((_, h) => h);
Nach dem Login kopieren
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. fillWenn 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.921ms
Nach dem Login kopieren
Wenn 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!

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!