Riktlinjer för bästa praxis vid användning av for-loopar i TypeScript
Den här artikeln förklarar riktlinjer för bästa praxis vid användning av for-loopar i TypeScript.
YouTube Video
Riktlinjer för bästa praxis vid användning av for-loopar i TypeScript
for
-satser är en grundläggande och kraftfull syntax för att utföra repetitiva operationer. I TypeScript möjliggör utnyttjandet av typkontroll och skrivande av kod med läsbarhet och underhållbarhet i åtanke att du kan skriva effektiv kod med färre fel.
Att välja rätt looptyp
TypeScript erbjuder flera loopkonstruktioner som passar för olika användningsområden. Att välja en lämplig loop är avgörande för kodens tydlighet och prestanda.
Standard for
-loop
1for (let i = 0; i < 10; i++) {
2 console.log(i);
3}
Den standardmässiga for
-loopen är idealisk när du behöver exakt kontroll över iterationsindexet.
Bästa praxis
1const maxIterations = 10;
2for (let i = 0; i < maxIterations; i++) {
3 console.log(i);
4}
När du skriver for
-satser kan du genom att tänka på följande punkter skriva säkrare och mer läsbar kod.
- Använd
let
för indexvariabler- Att använda
let
istället förvar
begränsar räckvidden till blocket och förhindrar oavsiktligt beteende.
- Att använda
- Använd konstanter och beskrivande variabelnamn för att göra loopgränser explicita
- Att undvika magiska nummer och använda meningsfulla variabelnamn förbättrar läsbarheten.
for...of
-loop
1const array = [1, 2, 3];
2for (let value of array) {
3 console.log(value);
4}
for...of
-loopen är lämplig för att iterera över itererbara objekt som arrayer och strängar.
Bästa praxis
1const array = [1, 2, 3];
2for (const value of array) {
3 console.log(value);
4}
När du skriver for...of
-loopar kan du genom att tänka på följande punkter skriva säkrare kod.
- Använd
const
för loopvariabler- Om värden inte ändras inom loopen hjälper användningen av
const
till att förhindra oavsiktlig återtilldelning.
- Om värden inte ändras inom loopen hjälper användningen av
for...in
-loop
1const obj = { a: 1, b: 2, c: 3 };
2for (const key in obj) {
3 console.log(`${key}: ${obj[key]}`);
4}
for...in
-loopen itererar över egenskapliga properties hos ett objekt.
Bästa praxis
1const obj = { a: 1, b: 2, c: 3 };
2for (const key in obj) {
3 if (obj.hasOwnProperty(key)) {
4 console.log(`${key}: ${obj[key]}`);
5 }
6}
När du skriver en for...in
-loop kan du tänka på följande punkter.
- Filtrera egenskaper
- Om du behöver undvika ärvda egenskaper kan du använda
hasOwnProperty
.
- Om du behöver undvika ärvda egenskaper kan du använda
- Använd inte
for...in
med arrayer Undvik att användafor...in
med arrayer. Det kan iterera över alla uppräkningsbara egenskaper, inklusive de som inte är arrayindex.
forEach
-metod
1const array = [1, 2, 3];
2array.forEach((value, index) => {
3 console.log(`Index: ${index}, Value: ${value}`);
4});
När du itererar över arrayer är forEach
kortfattad och eliminerar behovet av att hantera index.
Bästa praxis
När du använder metoden forEach
kan du tänka på följande punkter.
- Använd pilfunktioner
- Använd koncisa pilfunktioner för att förbättra läsbarheten.
- Undvik avbrott
forEach
stöder intebreak
ellercontinue
. Användfor...of
ellerfor
-loopar när det behövs:.
Typsäkerhet och felförebyggande
Genom att använda TypeScripts typsystem kan du förhindra körningsfel under iteration:.
Definiera strikta typer för loopvariabler
1const items = [1, 2, 3];
2items.forEach(item => {
3 console.log(item * 2);
4});
1const items: number[] = [1, 2, 3];
2items.forEach((item: number) => {
3 console.log(item * 2);
4});
Genom att explicit specificera typer för loopvariabler kan du upptäcka typkonflikter tidigt.
Undvik implicit any
1{
2 "compilerOptions": {
3 "noImplicitAny": true
4 }
5}
Genom att aktivera noImplicitAny
i tsconfig.json
kan du dessutom förhindra att variabler utan explicita typer tilldelas typen any
implicit.
Använd ReadonlyArray
när det behövs
1const numbers: ReadonlyArray<number> = [1, 2, 3];
2for (const value of numbers) {
3 console.log(value);
4}
Om du itererar över en array som inte bör modifieras kan du använda ReadonlyArray
.
Prestandaöverväganden
Effektivitet är avgörande för loopar som bearbetar stora datamängder eller körs ofta:.
Välj den optimala metoden för loop-implementering.
Det finns olika sätt att implementera loopar, alla med skillnader i läsbarhet och exekveringseffektivitet.
1// Prepare input data (an array from 1 to 1000000)
2const input: number[] = Array.from({ length: 1000000 }, (_, i) => i + 1);
3
4// --- for ---
5console.time('for loop');
6const squaresFor: number[] = [];
7for (let i = 0; i < input.length; i++) {
8 squaresFor.push(input[i] * input[i]);
9}
10console.timeEnd('for loop');
11
12// --- while ---
13console.time('while loop');
14const squaresWhile: number[] = [];
15let i: number = 0;
16while (i < input.length) {
17 squaresWhile.push(input[i] * input[i]);
18 i++;
19}
20console.timeEnd('while loop');
21
22// --- for-of ---
23console.time('for-of loop');
24const squaresForOf: number[] = [];
25for (const num of input) {
26 squaresForOf.push(num * num);
27}
28console.timeEnd('for-of loop');
29
30// --- forEach ---
31console.time('forEach loop');
32const squaresForEach: number[] = [];
33input.forEach((num: number): void => {
34 squaresForEach.push(num * num);
35});
36console.timeEnd('forEach loop');
37
38// --- map ---
39console.time('map');
40const squaresMap: number[] = input.map((value: number): number => value * value);
41console.timeEnd('map');
Effektiviteten varierar beroende på exekveringsmiljön, men till exempel, när man kör en loop en miljon gånger, kan skillnaden bli ganska märkbar. Välj den optimala loopmetoden med hänsyn till underhåll och prestanda.
Använd inbyggda iterationsmetoder
1const squares = [1, 2, 3].map(value => value * value);
2console.log(squares);
3
4const numbers = [1, 2, 3, 4, 5, 6];
5const evenNumbers = numbers.filter(value => value % 2 === 0);
6console.log(evenNumbers); // [2, 4, 6]
7
8const squaredEvens = numbers
9 .filter(value => value % 2 === 0) // Keep only even numbers
10 .map(value => value * value); // Square the remaining values
11
12console.log(squaredEvens); // [4, 16, 36]
Metoder som map
och filter
kan i vissa fall vara mer läsbara.
Föredra for...of
för läsbarhet
Prestanda bör prioriteras endast i begränsade fall; att skriva läsbar kod är generellt sett viktigare. Till exempel kan prioritering av for...of
förbättra läsbarheten.
1const fruits = ["apple", "banana", "cherry"];
2
3for (let i = 0; i < fruits.length; i++) {
4 console.log(`${i}: ${fruits[i]}`);
5}
Bästa praxis
1const fruits = ["apple", "banana", "cherry"];
2
3for (const [index, fruit] of fruits.entries()) {
4 console.log(`${index}: ${fruit}`);
5}
Genom att prioritera for...of
-loopar kan du skriva mer lättläst och felfri kod. Som visas i detta exempel, om du också behöver arrayindex, är det effektivt att kombinera entries()
med for...of
.
Undvik vanliga fallgropar
Ändra samlingar under iteration
1const array = [1, 2, 3];
2for (const value of [...array]) {
3 if (value === 2) {
4 array.push(4); // Avoid this!
5 }
6}
7console.log(array);
Att ändra en array under iteration kan leda till oväntat beteende:. Använd en kopia om nödvändigt.
Tänk på kantfall
1const array: number[] = [];
2for (const value of array) {
3 console.log(value); // No output, but no errors
4}
Den här koden fungerar bra, men om du behöver hantera tomma arrayer kan du förbättra den på följande sätt.
1const array: number[] = [];
2if (array.length === 0) {
3 console.log("The array is empty.");
4} else {
5 for (const value of array) {
6 console.log(value);
7 }
8}
Att överväga kantfall kan hjälpa till att förhindra fel i efterföljande kod.
Slutsats
För att bemästra for
-satsen i TypeScript är det viktigt att förstå olika loopstrukturer, följa typ-säkra praxis och optimera prestanda. Dessa bästa praxis hjälper dig att skriva renare, mer pålitlig och mer 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.