Bedste praksis for iteration i JavaScript
Denne artikel forklarer de bedste praksisser for iteration i JavaScript.
YouTube Video
Bedste praksis for iteration i JavaScript
I JavaScript er det almindeligt at bruge for
-løkker til iteration. Her vil vi give en detaljeret forklaring af de bedste praksisser for at bruge for
-løkker til at skrive effektiv og læsbar kode.
Vælg den rigtige løkkestruktur
JavaScript tilbyder flere forskellige løkkekonstruktioner, der hver især er velegnede til forskellige formå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
-sætningen er velegnet, når antallet af iterationer er forudbestemt.for...of
-sætningen er velegnet til kortfattet behandling af arrays og iterable objekter.for...in
-sætningen bruges til at iterere over et objekts egenskaber. Dog er den ikke velegnet til arrays.while
-sætningen ogdo...while
-sætningen bruges til at styre løkker baseret på betingelser.
Udnyttelse af forEach
-metoden og for...of
-sætningen.
Når man looper gennem et array, er det almindeligt at bruge en for
-sætning til at få adgang til indekset, men forEach
-metoden eller for...of
-sætningen kan være mere læsbar.
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
-sætningen tillader eksplicit styring af indekset under iteration.forEach
-metoden bruger en callback-funktion til kortfattet at behandle hvert element.for...of
-sætningen er meget læsbar og giver direkte adgang til hvert element i et array.
Optimer løkkens betingelser
Da løkkens betingelse evalueres gentagne gange, kan det forbedre ydeevnen at undgå unødvendige beregninger.
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 vist i dette eksempel, muliggør det mere effektiv loop-udførelse at gemme beregningsresultatet i en variabel på forhånd.
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 vist i dette eksempel, kan omvendelse af betingelsen nogle gange være mere effektivt.
Optimering af loop-behandling
Da loop-behandling udføres gentagne gange, kan undgåelse af unødvendige beregninger forbedre ydeevnen.
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 dette eksempel elimineres unødvendige gentagne beregninger ved at flytte
querySelector
-metoden uden for løkken.
Vær opmærksom på variablernes omfang
Brug let
eller const
for at sikre, at variabler i løkken har passende omfang. Da var
er begrænset til funktionsomfang, kan det forårsage uventet adfærd.
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 funktionsscope, så efter løkken eri
3
, og alle funktioner udført afsetTimeout
returnerer3
.- Ved at bruge
let
referereri
inde isetTimeout
-callback-funktionen til en ny værdi for hver iteration, så0, 1, 2
returneres som forventet.
Forbedr læsbarheden med tidlige afslutninger
For at forenkle løkkens behandling skal du bruge break
og continue
på passende måde for at forbedre læsbarheden.
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}
- Ved at bruge
break
kan du afbryde loop-behandlingen midtvejs og springe alle efterfølgende iterationer over. - Ved at bruge
continue
kan du springe den nuværende loop-proces over og gå videre til næste iteration.
Undgå dyb indlejringer
Dyb indlejring gør koden sværere at læse, så stræb efter at holde indlejringen lav ved at bruge tidlige returneringer eller opdele funktionaliteten 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 dette eksempel bruges funktioner til at reducere indlejring.
Overvej fejlbehandling
Hvis der er mulighed for fejl i løkken, implementer korrekt fejlbehandling.
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 dette eksempel udføres fejlhåndtering for at behandle ugyldige data, opdage og rapportere problemer.
Punkter at bemærke ved asynkron behandling
Når der håndteres asynkron behandling i løkker, kan brug af async/await
resultere i kortfattet og intuitiv kode.
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();
- Denne kode henter asynkront URL'er fra
urls
-arrayet én efter én og behandler resultaterne i JSON-format. Ved at brugeasync/await
forenkles asynkrone operationer, og data for hver URL hentes sekventielt og sendes til konsollen.
Forstå forskellen mellem for...of
-sætningen og forEach()
i asynkron behandling.
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 håndterer asynkron behandling i løkker, skal du bemærke forskellene i adfærd, som vist i dette eksempel, mellem at bruge
for...of
medasync/await
og at brugeforEach()
. -
Med
for...of
udføres koden sekventielt og venter vedawait
inde i løkken, før den fortsætter til næste iteration. På den anden side udførerforEach()
behandlingen parallelt.
Konklusion
for
-sætningen i JavaScript er et simpelt, men kraftfuldt værktøj. Ved at udnytte de her introducerede bedste praksisser kan du skrive effektiv og meget læsbar kode. Vær opmærksom på at vælge passende løkkestrukturer, håndtere scope, fejlhåndtering og sigt mod meget vedligeholdelsesvenlig kode.
Du kan følge med i ovenstående artikel ved hjælp af Visual Studio Code på vores YouTube-kanal. Husk også at tjekke YouTube-kanalen.