Bästa metoderna för iteration i JavaScript
Denna artikel förklarar de bästa metoderna för iteration i JavaScript.
YouTube Video
Bästa metoderna för iteration i JavaScript
I JavaScript är det vanligt att använda for
-loopar för iteration. Här kommer vi att ge en detaljerad förklaring av de bästa metoderna för att använda for
-loopar för att skriva effektiv och läsbar kod.
Välj rätt loop-struktur
JavaScript erbjuder flera loop-strukturer, var och en anpassad för olika ändamål.
1// Example of a for loop
2for (let i = 0; i < 5; i++) {
3 console.log(i);
4}
5
6// Example of a for...of loop
7const array = [10, 20, 30];
8for (const value of array) {
9 console.log(value);
10}
11
12// Example of a for...in loop
13const obj = { a: 1, b: 2, c: 3 };
14for (const key in obj) {
15 console.log(`${key}: ${obj[key]}`);
16}
17
18// Example of a while loop
19let count = 0;
20while (count < 5) {
21 console.log(count);
22 count++;
23}
for
-satsen är lämplig när antalet iterationer är förutbestämt.for...of
-satsen är lämplig för att kortfattat bearbeta arrayer och itererbara objekt.for...in
-satsen används för att iterera igenom ett objekts egenskaper. Dock är den inte lämplig för arrayer.while
-satsen ochdo...while
-satsen används för att styra loopar baserat på villkor.
Användning av forEach
-metoden och for...of
-satsen.
När man loopar genom en array är det vanligt att använda en for
-sats för att komma åt indexet, men forEach
-metoden eller for...of
-satsen kan vara mer lättläst.
1// Using a standard for loop
2const array = ["apple", "banana", "cherry"];
3for (let i = 0; i < array.length; i++) {
4 console.log(array[i]);
5}
6
7// Using forEach
8array.forEach(item => console.log(item));
9
10// Using for...of
11for (const item of array) {
12 console.log(item);
13}
for
-satsen möjliggör explicit indexhantering under iteration.forEach
-metoden använder en callback-funktion för att bearbeta varje element kortfattat.for...of
-satsen är mycket lättläst och möjliggör direkt åtkomst till varje element i en array.
Optimera loopvillkor
Eftersom loopvillkoret utvärderas upprepade gånger kan undvikande av onödiga beräkningar förbättra prestandan.
1const names = ["Alice", "Bob", "Charlie"];
2const scores = [85, 92, 78];
3
4// Inefficient example
5for (let i = 0; i < Math.min(names.length, scores.length); i++) {
6 console.log(`${names[i]} scored ${scores[i]}`);
7}
8
9// Efficient example
10for (let i = 0, len = Math.min(names.length, scores.length); i < len; i++) {
11 console.log(`${names[i]} scored ${scores[i]}`);
12}
- Som visas i detta exempel kan lagring av beräkningsresultatet i en variabel i förväg möjliggöra en mer effektiv loopkörning.
1const scores = [85, 92, 78];
2let sum = 0;
3let sum2 = 0;
4
5// Inefficient example
6for (let i = 0; i < scores.length; i++) {
7 sum += scores[i];
8}
9console.log(`Total score : ${sum}`);
10
11// Efficient example
12for (let i = scores.length - 1; i >= 0; i--) {
13 sum2 += scores[i];
14}
15console.log(`Total score : ${sum2}`);
- Som visas i detta exempel kan det ibland vara mer effektivt att vända på villkoret.
Optimera loopbearbetning
Eftersom loopbearbetning utförs upprepade gånger kan undvikande av onödiga beräkningar förbättra prestandan.
1const array = ["apple", "banana", "cherry"];
2
3// Inefficient example
4for (let i = 0; i < 100; i++) {
5 const element = document.querySelector("#myElement");
6 element.textContent = `Count: ${i}`;
7}
8
9// Efficient example
10const element = document.querySelector("#myElement");
11for (let i = 0; i < 100; i++) {
12 element.textContent = `Count: ${i}`;
13}
- I det här exemplet elimineras onödiga upprepade beräkningar genom att flytta
querySelector
-metoden utanför loopen.
Var medveten om variablers räckvidd
Använd let
eller const
för att säkerställa att variablerna inuti loopen har lämplig räckvidd. Eftersom var
är begränsad till funktionsräckvidd kan det orsaka oväntat beteende.
1// Using let
2for (let i = 0; i < 3; i++) {
3 console.log(i);
4}
5
6// Potential issue with var
7for (var i = 0; i < 3; i++) {
8 setTimeout(() => console.log(i), 1000); // 3, 3, 3
9}
10
11// Using let to avoid the issue
12for (let i = 0; i < 3; i++) {
13 setTimeout(() => console.log(i), 1000); // 0, 1, 2
14}
var
har funktionsomfattning, så efter loopen äri
3
, och alla funktioner som körs avsetTimeout
returnerar3
.- Med hjälp av
let
hänvisari
inutisetTimeout
-återanropsfunktionen till ett nytt värde för varje iteration, så0, 1, 2
returneras som förväntat.
Förbättra läsbarheten med tidiga avbrott
För att förenkla loophanteringen, använd break
och continue
på ett lämpligt sätt för att förbättra läsbarheten.
1// Example using break
2for (let i = 0; i < 10; i++) {
3 if (i === 5) {
4 break; // Exit the loop
5 }
6 console.log(i);
7}
8
9// Example using continue
10for (let i = 0; i < 10; i++) {
11 if (i % 2 === 0) {
12 continue; // Skip to the next iteration
13 }
14 console.log(i);
15}
- Genom att använda
break
kan du avsluta loopens bearbetning i förtid och hoppa över alla efterföljande iterationer. - Med
continue
kan du hoppa över den aktuella loop-bearbetningen och gå vidare till nästa iteration.
Undvik djupa inbäddningar
Djup inbäddning gör koden svårare att läsa, så sträva efter att hålla inbäddningen ytlig genom att använda tidiga återvändningar eller genom att dela upp funktionalitet i funktioner.
1// Deeply nested example
2for (let i = 0; i < 5; i++) {
3 for (let j = 0; j < 5; j++) {
4 if (i + j > 5) {
5 console.log(i, j);
6 }
7 }
8}
9
10// Improved using function decomposition
11function processPairs(i) {
12 for (let j = 0; j < 5; j++) {
13 if (i + j > 5) {
14 console.log(i, j);
15 }
16 }
17}
18
19for (let i = 0; i < 5; i++) {
20 processPairs(i);
21}
- I det här exemplet används funktioner för att minska inbäddning.
Överväg felhantering
Om det finns en möjlighet att fel kan uppstå i loopen, implementera korrekt felhantering.
1const data = ["123", "abc", "456", "xyz"];
2
3// Without Error Handling
4for (const item of data) {
5 const result = parseInt(item);
6 console.log(`Parsed value: ${result}`);
7}
8
9// With Error Handling
10for (const item of data) {
11 try {
12 const result = parseInt(item);
13 if (isNaN(result)) {
14 throw new Error(`Invalid number: ${item}`);
15 }
16 console.log(`Parsed value: ${result}`);
17 } catch (error) {
18 console.error(`Error processing item: ${item}. ${error.message}`);
19 }
20}
- I det här exemplet utförs felhantering för att bearbeta ogiltiga data, upptäcka och rapportera problem.
Punkter att notera vid asynkron bearbetning
Vid hantering av asynkron bearbetning i loopar kan användning av async/await
resultera i kortfattad och intuitiv kod.
1const urls = ["https://example.com/1", "https://example.com/2"];
2
3// Proper handling of asynchronous operations
4async function fetchUrls() {
5 for (const url of urls) {
6 const response = await fetch(url);
7 const data = await response.json();
8 console.log(data);
9 }
10}
11
12fetchUrls();
- Den här koden hämtar URL:er asynkront från
urls
-arrayen en efter en och bearbetar resultaten i JSON-format. Användning avasync/await
förenklar asynkrona operationer genom att sekventiellt hämta data för varje URL och skriva ut det till konsolen.
Förstå skillnaden mellan for...of
-satsen och forEach()
vid asynkron bearbetning
1async function asyncTask(num) {
2 return new Promise(resolve => {
3 setTimeout(() => {
4 console.log(`Task ${num} done`);
5 resolve();
6 }, 100);
7 });
8}
9
10async function runWithForOf() {
11 console.log("Start for...of");
12 for (const num of [1, 2, 3]) {
13 await asyncTask(num);
14 }
15 console.log("End for...of");
16}
17
18async function runWithForEach() {
19 console.log("Start forEach");
20 [1, 2, 3].forEach(async num => {
21 await asyncTask(num);
22 });
23 console.log("End forEach");
24}
25
26async function executeExamples() {
27 await runWithForOf();
28 await runWithForEach();
29}
30
31executeExamples();
-
När du hanterar asynkron bearbetning i loopar, notera skillnaderna i beteende, vilket visas i detta exempel, mellan att använda
for...of
medasync/await
och att användaforEach()
. -
Med
for...of
exekveras koden sekventiellt och väntar vidawait
inuti loopen innan den fortsätter till nästa iteration. Å andra sidan exekverarforEach()
bearbetningen parallellt.
Slutsats
for
-satsen i JavaScript är ett enkelt men kraftfullt verktyg. Genom att använda de bästa metoderna som introducerats här kan du skriva effektiv och mycket läsbar kod. Var uppmärksam på att välja lämpliga loopkonstruktioner, hantering av scope, felhantering och sträva efter mycket underhållbar kod.
Du kan följa med i artikeln ovan med hjälp av Visual Studio Code på vår YouTube-kanal. Vänligen kolla även in YouTube-kanalen.