Es gibt drei Probleme bei der Verwendung von for_in zum Durchlaufen eines Arrays:
Die Durchlaufreihenfolge ist nicht festgelegt
Die JavaScript-Engine garantiert nicht die Durchlaufreihenfolge von Objekten. Beim Durchlaufen eines Arrays als normales Objekt ist die Indexreihenfolge der Durchquerung ebenfalls nicht garantiert.
durchläuft die Werte in der Objektprototypkette.
Wenn Sie das Prototypobjekt des Arrays (z. B. Polyfill) ändern, ohne es auf <code><span style="font-size: 14px;">enumerable: false</span>
enumerable: false, for_in wird diese Dinge durchlaufen.
Ineffizienter Betrieb.
Obwohl JavaScript theoretisch die Form von Objekten zum Speichern von Arrays verwendet, optimiert die JavaScript-Engine dennoch Arrays, ein sehr häufig verwendetes integriertes Objekt. https://jsperf.com/for-in-vs-...
Sie können sehen, dass die Verwendung von for_in zum Durchlaufen des Arrays mehr als 50-mal langsamer ist als die Verwendung von Indizes zum Durchlaufen des Arrays
PS: Möglicherweise suchen Sie nach for_of
Jemand verwendet JSON. Eine mitteltiefe Kopie eines Objekts oder Arrays. Obwohl dies in den meisten Fällen eine einfache und bequeme Methode ist, kann sie auch unbekannte Fehler verursachen, da
einige spezifische Werte in <span style="font-size: 14px;">null</span>
null
NaN, undefiniert, Infinity Diese Werte, die in JSON nicht unterstützt werden, werden bei der Serialisierung von JSON konvertiert null. Nach der Deserialisierung ist es natürlich null
und das Schlüssel-Wert-Paar mit undefiniertem Wert geht verloren
Schlüssel mit undefinierten Werten werden während der JSON-Serialisierung ignoriert und gehen nach der Deserialisierung verloren.
ersetzt Convert the Objekt in einen String
JSON unterstützt keine Objekttypen. Das Date-Objekt in JS wird durch Konvertierung in einen String im ISO8601-Format verarbeitet. Bei der Deserialisierung wird die Zeitformatzeichenfolge jedoch nicht in ein Datumsobjekt
konvertiert, was ineffizient ist.
als native Funktion, <span style="font-size: 14px;">JSON.stringify</span>
<span style="font-size: 14px;">JSON.stringify</span>
<span style="font-size: 14px;">JSON.parse</span>
und JSON.parse
Die Geschwindigkeit der Verarbeitung von JSON-Strings allein ist sehr hoch. Es ist jedoch völlig unnötig, das Objekt in JSON zu serialisieren und wieder zu deserialisieren, um das Array tief zu kopieren.
Ich habe einige Zeit damit verbracht, eine einfache Deep-Copy-Funktion eines Arrays oder Objekts zu schreiben. Der Test ergab übrigens, dass die Ausführungsgeschwindigkeit fast sechsmal so hoch ist wie bei der Verwendung von JSON Unterstützt auch TypedArray und das Kopieren von RegExp-Objekten
Verwenden Sie nicht arr. find statt arr .some<span style="font-size: 14px;">Array.prototype.find</span>
<code><span style="font-size: 14px;">Array.prototype.some</span>
Array.prototype.find ist eine neue Array-Suchfunktion in ES2015, die identisch ist mit
Array.prototype.some<span style="font-size: 14px;">Array.prototype.find</span>
ist ähnlich, aber kein Ersatz für Letzteres. <span style="font-size: 14px;">if</span>
Array.prototype.find Gibt den ersten qualifizierten Wert zurück. Verwenden Sie diesen Wert direkt als <span style="font-size: 14px;">arr.find</span>
<span style="font-size: 14px;"> if</span>
<span style="font-size: 14px;">arr.some</span>
Bestimmen Sie, ob er existiert. Was passiert, wenn dieser qualifizierte Wert zufällig 0 ist?
arr.find
dient dazu, den Wert im Array zu finden und ihn dann weiterzuverarbeiten. Wird im Allgemeinen verwendet Objektarray; arr.some
wird verwendet, um die Existenz der beiden zu überprüfen; ist auch ein Fehler, den JavaScript-Anfänger oft machen. Sie unterscheiden oft nicht zwischen <code><span style="font-size: 14px;">Array.prototype.map</span>
Die eigentliche Bedeutung von Array.prototype.map und <span style="font-size: 14px;">Array.prototype.forEach</span>
<span style="font-size: 14px;">Array.prototype.forEach</span>
<span style="font-size: 14px;">map</span>
Karte
<span style="font-size: 14px;">映射</span>
Chinesisch heißt
<span style="font-size: 14px;">forEach</span>
, Leiten Sie eine neue Sequenz ab, indem Sie nacheinander eine Funktion für eine Sequenz ausführen. Diese Funktion hat normalerweise keine Nebenwirkungen und verändert das ursprüngliche Array nicht (sog. reine Funktion). <span style="font-size: 14px;">forEach</span>
<span style="font-size: 14px;">forEach</span>
<span style="font-size: 14px;">forEach</span>
Es gibt nicht viel zu sagen, es verarbeitet einfach alle Elemente im Array mit einer bestimmten Funktion. Da forEach
keinen Rückgabewert hat (undefiniert zurückgibt), enthält seine Rückruffunktion normalerweise Nebenwirkungen, andernfalls ist dies forEach
<span style="font-size: 14px;">map</span>
ist bedeutungslos. <span style="font-size: 14px;">forEach</span>
In der Tat ist <span style="font-size: 14px;">map</span>
<span style="font-size: 14px;">map</span>
<span style="font-size: 14px;">map</span>
besser als forEach
<span style="font-size: 14px;">forEach</span>
<span style="font-size: 14px;">map</span>
<span style="font-size: 14px;">map</span>
<span style="font-size: 14px;">Array.prototype.forEach</span>
verwenden, sollten Sie forEach
Ergänzung: forEach und break
ES6 Früher gab es zwei Hauptmethoden zum Durchlaufen von Arrays: handgeschriebene Schleifen mit Indizes zum Iterieren und mit <span style="font-size: 14px;">return</span>
<span style="font-size: 14px;">Array.prototype.forEach</span>
<span style="font-size: 14px;">continue</span>
. Ersteres ist vielseitig und am effizientesten, aber das Schreiben ist umständlicher – es kann die Werte im Array nicht direkt abrufen. <span style="font-size: 14px;">break</span>
Letzteres gefällt dem Autor persönlich: Sie können den Index und den Wert der Iteration sowie den Funktionsstil direkt erhalten (beachten Sie, dass sich FP auf unveränderliche Datenstrukturen konzentriert und forEach von Natur aus a ist Es gibt einen Nebeneffekt, daher gibt es nur die Form von FP, aber keinen Gott. Es ist sehr erfrischend zu schreiben. Aber! Ich frage mich, ob einer von euch Schülern bemerkt hat: Sobald forEach einmal gestartet ist, kann es nicht mehr gestoppt werden. . . <span style="font-size: 14px;">break</span>
forEach akzeptiert eine Rückruffunktion. Sie können im Voraus
<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false"><span style="font-size: 14px;">[1, 2, 3, 4, 5].forEach(x => {<br> console.log(x);<br> if (x === 3) {<br> break; // SyntaxError: Illegal break statement<br> }<br>});<br></span></pre><div class="contentsignin">Nach dem Login kopieren</div></div>zurückkehren<p></p>
, was
weiter<span style="font-size: 14px;">scala</span>
. Aber Sie können nicht
brechen<p>brechen</p>
: Es gibt noch Lösungen. Bei anderen funktionalen Programmiersprachen wie <code><span style="font-size: 14px;">arr.forEach</span>
scala sind ähnliche Probleme aufgetreten. Es bietet eine <span style="font-size: 14px;">break</span>
Funktionsunterbrechung , die dies tut Löst eine Ausnahme aus.
<span style="font-size: 14px;">try {<br> [1, 2, 3, 4, 5].forEach(x => {<br> console.log(x);<br> if (x === 3) {<br> throw 'break';<br> }<br> });<br>} catch (e) {<br> if (e !== 'break') throw e; // 不要勿吞异常。。。<br>}<br></span>
<code><span style="font-size: 14px;">Array.prototype.some</span><span style="font-size: 14px;">Array.prototype.forEach</span>
Wir können diesem Ansatz folgen, um arr.forEach
sPause
<span style="font-size: 14px;">some</span>
:<span style="font-size: 14px;">true</span>
Ein widerliches Paar falsch. Es gibt andere Methoden, wie zum Beispiel die Verwendung von
anstelle von <span style="font-size: 14px;">break</span>
Array.prototype.some
Array.prototype.forEach. Berücksichtigen Sie die Eigenschaften von Array.prototype.some, wenn <code>some
einen qualifizierten Wert findet (Rückruf). die Funktion gibt true
zurück, sie wird sofort die Schleife beenden. Diese Funktion kann verwendet werden, um Pause
:<span style="font-size: 14px;">[1, 2, 3, 4, 5].some(x => {<br> console.log(x);<br> if (x === 3) {<br> return true; // break<br> }<br> // return undefined; 相当于 false<br>});<br></span>
<span style="font-size: 14px;">some</span>
的返回值被忽略掉了,它已经脱离了判断数组中是否有元素符合给出的条件这一原始的含义。
在 ES6 前,笔者主要使用该法(其实因为 Babel 代码膨胀的缘故,现在也偶尔使用),ES6 不一样了,我们有了 for...of。<span style="font-size: 14px;">for...of</span>
是真正的循环,可以 <span style="font-size: 14px;">break</span>
:
<span style="font-size: 14px;">for (const x of [1, 2, 3, 4, 5]) {<br> console.log(x);<br> if (x === 3) {<br> break;<br> }<br>}<br></span>
但是有个问题,<span style="font-size: 14px;">for...of</span>
似乎拿不到循环的下标。其实 JavaScript 语言制定者想到了这个问题,可以如下解决:
<span style="font-size: 14px;">for (const [index, value] of [1, 2, 3, 4, 5].entries()) {<br> console.log(`arr[${index}] = ${value}`);<br>}<br></span>
Array.prototype.entries
<span style="font-size: 14px;">for...of</span>
和 <span style="font-size: 14px;">forEach</span>
的性能测试:https://jsperf.com/array-fore... Chrome 中 <span style="font-size: 14px;">for...of</span>
要快一些哦
Das obige ist der detaillierte Inhalt vonGrundlagen von Array-Operationen in JavaScript. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!