Komplexa variabler: Skillnad mellan sidversioner

Från Webbling
Hoppa till: navigering, sök
Ingen redigeringssammanfattning
 
(11 mellanliggande sidversioner av samma användare visas inte)
Rad 1: Rad 1:
Komplexa, eller sammansatta, variabler kan innehålla flera olika värden.  Den vanligaste sammansatta variabeltypen är arrayer. Vilket är en typ av variabel där vi kan ange ett index för att tala om vilket värde vi vill komma åt.
Komplexa, eller sammansatta, variabler är en typ av variabler som kan innehålla flera olika värden.  Den vanligaste typ av sammansatta variabler är arrayer. Vilket är en typ av variabel där vi kan ange ett index för att tala om vilket värde vi vill komma åt.


Har du programmerat i något annat språk kan det vara bra att veta att i JavaScript så är arrayer och listor ungefär samma sak.  
Har du programmerat i något annat språk, t.ex. C#, kan det vara bra att veta att i JavaScript så är arrayer och listor ungefär samma sak. Arrayerna kan användas mer dynamiskt än i många andra språk.


== Skapa en array ==
== Skapa en array ==
En array skapas så här:
En array skapas så här:
<div class="well well-cyanide-light">
<syntaxhighlight lang="JavaScript">
<syntaxhighlight lang="JavaScript">
let värden = [ 1, 2, 3, 4 ];
let värden = [ 1, 2, 3, 4 ];
</syntaxhighlight>
</syntaxhighlight>
</div>


I exemplet ovan skapas en array som innehåller fyra element. Elementen har värdena ett till fyra.
I exemplet ovan skapas en array som innehåller fyra element. Elementen har värdena från <code>1</code> till <code>4</code>.


== Läsa ifrån en array ==
== Läsa ifrån en array ==
För att komma åt ett specifikt element i arrayen kan vi göra som följer:
För att komma åt ett specifikt element i en array använder vi oss av <code>[</code>''index''<code>]</code>. Där ''index'' talar om vilket specifikt värde vi vill komma åt.  Ett exempel på detta.


<div class="well well-cyanide-light">
<syntaxhighlight lang="JavaScript">
<syntaxhighlight lang="JavaScript">
let ettVärde = värden[0];
let ettVärde = värden[0];
</syntaxhighlight>
</syntaxhighlight>
</div>


Ovanstående kod kommer att plocka ut det ''första'' värdet i arrayen. I programmering brukar vi oftast börja att räkna ifrån noll.
Ovanstående kod kommer att plocka ut det ''första'' värdet i arrayen. I programmering brukar vi oftast börja att räkna ifrån noll. Arrayen <code>värden</code> innehåller fyra element. Elementen är indexerade ifrån <code>0</code> till <code>3</code>. Sista elementet är alltså element nummer <code>3</code>,  dvs ett mindre än antalet element. Detta är på grund av att vi räknar ifrån noll.


Arrayen <code>värden</code> innehåller fyra element. Elementen är indexerade ifrån <code>0</code> till <code>3</code>. Sista elementet är alltså element nummer <code>3</code>, dvs ett mindre än antalet element. Detta är grund av att vi räknar ifrån noll.
Vill vi ändra på innehållet i ett element, gör vi som ovan men med den skillnad att vi gör en tilldelning till elementet, t.ex.:
<syntaxhighlight lang="JavaScript">
värden[2] = 42;
</syntaxhighlight>
 
Liksom "vanliga" variabler, kan man ändra datatypen vid en tilldelning.


== Gå igenom en array ==
== Gå igenom en array ==
Vi vill ofta gå igenom hela, eller delar av, arrayen och göra nåt med elementen som den innehåller. Det kan man göra på lite olika sätt...
Vi vill ofta gå igenom hela, eller delar av, arrayen och göra nåt med elementen som den innehåller. Det kan man göra på lite olika sätt...


(Som vi kommer att se strax, är det lite skillnad på hur dessa två sätt beter sig i vissa undantagsfall.)
(Som vi kommer att se är det lite skillnad på hur dessa två sätt beter sig)


=== <code>for</code>-loop ===
=== <code>for</code>-loop ===
<code>for</code>-loopar är en metod som vi kan använda oss av om vi vill gå igenom alla element i en array. Varje array har en egenskap som heter <code>length</code>, den är satt till det antal element som finns i arrayen. Genom att använda oss av <code>length</code> kan vi göra en <code>for</code>-loop på följande vis:
<code>for</code>-loopar är en metod som vi kan använda oss av om vi vill gå igenom elementen i en array.
 
Varje array har en egenskap som heter <code>length</code>, den är satt till det antal element som finns i arrayen. Genom att använda oss av <code>length</code> kan vi göra en <code>for</code>-loop på följande vis:


<div class="well well-cyanide-light">
<syntaxhighlight lang="JavaScript">
<syntaxhighlight lang="JavaScript">
for(i = 0; i < värden.length; i++) {
for(let i = 0; i < värden.length; i++) {
   let ettVärde = värden[ i ];
   let ettVärde = värden[ i ];
   console.log(ettVärde);
   console.log(ettVärde);
}
}
</syntaxhighlight>
</syntaxhighlight>
</div>


I exemplet skriver vi alltså ut alla element i <code>värden</code>.
I exemplet skriver vi alltså ut alla element i <code>värden</code>.
Lägg märke till att loopens test-del använder "<code>&lt;</code>", dvs loopen avslutas när den är ett steg under <code>length</code>. Vi konstaterade ju tidigare att elementen i arrayer indexeras ifrån <code>0</code> till och med <code>length - 1</code>. Vilket innebär att vi vill avsluta loopen ett steg under <code>length</code>.  När vi använder oss av <code>&lt;</code>, så avslutas loopen efter man nått sista elementet.
Då man kör en <code>for</code>-loop för att gå igenom arrayen, kan man använda sig av de vanliga <code>continue</code> och <code>break</code>. Vi kan alltså skippa steg och fortsätta med nästa element och vi kan bryta oss ur loopen helt och hållet. Det senare kan vara bra om vi t.ex. gjort allt som behöver göras och därmed inte behöver fortsätta igenom hela arrayen. Ett exempel på detta kunde vara att vi söker efter ett specifikt värde i arrayen, när vi hittar på det kanske vi vill bryta oss ur loopen istället för att gå igenom den helt och hållet.


=== <code>forEach</code> ===
=== <code>forEach</code> ===
Ett annat sätt på vilket vi kan gå igenom en array är att använda oss av metoden <code>forEach</code>. Så här skulle föregående exempel bli att se ut om vi använder oss av <code>forEach</code> istället för en <code>for</code>-loop.
Ett annat sätt på vilket vi kan gå igenom en array är att använda oss av metoden <code>forEach</code>. Det är en metod som ingår i alla array-variabler. Vi anropar den genom att ange arraynamnet följt av <code>.forEach()</code>. <code>forEach</code> går igenom en array, element för element, och anropar en funktion för varje element.
 
Så här skulle föregående exempel bli att se ut om vi använder oss av <code>forEach</code> istället för en <code>for</code>-loop.


<div class="well well-cyanide-light">
<syntaxhighlight lang="JavaScript">
<syntaxhighlight lang="JavaScript">
function SkrivUt(n) {
function skrivUt(n) {
   console.log(n);
   console.log(n);
}
}


värden.forEach(SkrivUt);
värden.forEach(skrivUt);
</syntaxhighlight>
</syntaxhighlight>
</div>


<code>forEach</code> kommer att gå igenom arrayen <code>värden</code>, element efter element. Varje element som plockas ut, kommer att skickas till funktionen <code>SkrivUt</code>. Funktionen kommer att få det utplockade elementet som input.
<code>forEach</code> plockar ut varje element var för sig. Varje element som plockas ut, kommer att skickas till funktionen <code>skrivUt</code>. Funktionen kommer att få det utplockade elementet som input, dvs <code>skrivUt</code>:s <code>n</code> kommer att sättas till ett element-värde.


I JavaScript behandlar man funktioner som "vanliga" variabler. Vi skickar <code>SkrivUt</code> som parameter till <code>forEach</code> och eftersom den inte har <code>()</code> efter sig, så ses den som en variabel. Skulle vi haft <code>()</code> efter den, skulle den körts direkt. <code>forEach</code> kommer använda sig av funktions-variabeln och köra den koden.
I JavaScript behandlar man funktioner som "vanliga" variabler. Vi skickar <code>skrivUt</code> som parameter till <code>forEach</code> och eftersom den inte har <code>()</code> efter sig, så ses den som en variabel. Skulle vi haft <code>()</code> efter den, skulle funktionen körts direkt.
 
Man kan ''inte'' använda sig av <code>break</code> eller <code>continue</code> med <code>forEach</code>.


== Oväntade beteenden ==
== Oväntade beteenden ==
Hur JavaScript hanterar arrayer kan ibland vara lite "konstigt". Vi ska gå igenom några exempel...
Hur JavaScript hanterar arrayer kan ibland vara lite "konstigt". Vi ska gå igenom några exempel...


<h3>Läsa utanför arrayen</h3>
===Läsa utanför arrayen===
<div class="well well-cyanide-light">
<syntaxhighlight lang="JavaScript">
<syntaxhighlight lang="JavaScript">
let värden = [ 1, 2, 3, 4 ];
let värden = [ 1, 2, 3, 4 ];
Rad 72: Rad 79:
console.log(värden[10]);
console.log(värden[10]);
</syntaxhighlight>
</syntaxhighlight>
</div>


Koden ovan kommer att generera ett felmeddelande. Vår array innehåller ju bara fyra värden, men vi försöker komma åt det elfte (kom ihåg att vi räknar ifrån noll). JavaScript slår därmed bakut och vägrar köra koden.
Vår array innehåller ju bara fyra värden, men vi försöker komma åt det elfte (kom ihåg att vi räknar ifrån noll). Vi kommer inte att få ett felmeddelande, istället får vi värdet <code>undefined</code>. JavaScript bryr sig alltså inte om att vi är "utanför" den array vi definierat. Däremot har vi ju inte satt något värde i det angivna elementet och vi får därför tillbaka <code>undefined</code>, vilket ju stämmer.


=== Skriva utanför arrayen ===
=== Skriva utanför arrayen ===


Vad händer om vi gör följande:
Vad händer om vi gör följande:
<div class="well well-cyanide-light">
<syntaxhighlight lang="JavaScript">
<syntaxhighlight lang="JavaScript">
let värden = [ 1, 2, 3, 4 ];
let värden = [ 1, 2, 3, 4 ];
Rad 87: Rad 92:
console.log(värden[10]);
console.log(värden[10]);
</syntaxhighlight>
</syntaxhighlight>
</div>


I detta fall kommer koden att köras och vi får värdet <code>5</code> utskrivet. Vår array kommer alltså att göras större och bli att innehålla elva element. Men vad händer med de element som ligger på positionerna där vi inte angivit några värden? Vi provar:
I detta fall kommer koden att köras och vi får värdet <code>5</code> utskrivet. Vår array kommer alltså att göras större och bli att innehålla elva element. Men vad händer med de element som ligger på positionerna där vi inte angivit några värden? Vi provar:
<div class="well well-cyanide-light">


<syntaxhighlight lang="JavaScript">
<syntaxhighlight lang="JavaScript">
Rad 100: Rad 102:
console.log(värden[9]);
console.log(värden[9]);
</syntaxhighlight>
</syntaxhighlight>
</div>


Vi får då utskriften <code>undefined</code>. Det blir ingen error, så elementet existerar. Men vi har inte satt det till något värde, därmed är det odefinierat.
Vi får då utskriften <code>undefined</code>. Det blir ingen error, så elementet existerar. Men vi har inte satt det till något värde, därmed är det odefinierat.


=== Skillnad på <code>for</code>-loop och <code>forEach</code> ===
==== Skillnad på <code>for</code>-loop och <code>forEach</code> ====
Om vi vill gå igenom alla element i arrayen,  så kommer vi i det här fallet att få olika resultat beroende på vilken loop-typ vi använder. Vi provar en <code>for</code>-loop först.
Om vi vill gå igenom alla element i arrayen,  så kommer vi i det här fallet att få olika resultat beroende på vilken loop-typ vi använder. Vi provar en <code>for</code>-loop först.


<div class="well well-cyanide-light">
<syntaxhighlight lang="JavaScript">
<syntaxhighlight lang="JavaScript">
for(i = 0; i < värden.length; i++) {
for(let i = 0; i < värden.length; i++) {
   let ettVärde = värden[ i ];
   let ettVärde = värden[ i ];
   console.log(ettVärde);
   console.log(ettVärde);
}
}
</syntaxhighlight>
</syntaxhighlight>
</div>


Siffrorna 1-4 skrivs ut som vi förväntat oss. Därefter följer en del <code>undefined</code>, ända tills vi  når femman. Det var väl vad vi förväntat oss.
Siffrorna 1-4 skrivs ut som vi förväntat oss. Därefter följer en del <code>undefined</code>, ända tills vi  når femman. Det var väl vad vi förväntat oss.
Rad 120: Rad 119:
Nu provar vi med en <code>forEach</code>-loop istället.
Nu provar vi med en <code>forEach</code>-loop istället.


<div class="well well-cyanide-light">
<syntaxhighlight lang="JavaScript">
<syntaxhighlight lang="JavaScript">
function SkrivUt(n) {
function SkrivUt(n) {
Rad 128: Rad 126:
värden.forEach(SkrivUt);
värden.forEach(SkrivUt);
</syntaxhighlight>
</syntaxhighlight>
</div>


Nu får vi enbart siffrorna 1-5 och det blir inte med något av de element vars värde är <code>undefined</code>. <code>forEach</code> skippar alltså över de element som inte är satta till något värde!
Nu får vi enbart siffrorna 1-5 och vi ser inte något av de element vars värde är <code>undefined</code>. <code>forEach</code> skippar alltså över de element som inte är satta till något värde!

Nuvarande version från 30 juni 2021 kl. 12.00

Komplexa, eller sammansatta, variabler är en typ av variabler som kan innehålla flera olika värden. Den vanligaste typ av sammansatta variabler är arrayer. Vilket är en typ av variabel där vi kan ange ett index för att tala om vilket värde vi vill komma åt.

Har du programmerat i något annat språk, t.ex. C#, kan det vara bra att veta att i JavaScript så är arrayer och listor ungefär samma sak. Arrayerna kan användas mer dynamiskt än i många andra språk.

Skapa en array

En array skapas så här:

let värden = [ 1, 2, 3, 4 ];

I exemplet ovan skapas en array som innehåller fyra element. Elementen har värdena från 1 till 4.

Läsa ifrån en array

För att komma åt ett specifikt element i en array använder vi oss av [index]. Där index talar om vilket specifikt värde vi vill komma åt. Ett exempel på detta.

let ettVärde = värden[0];

Ovanstående kod kommer att plocka ut det första värdet i arrayen. I programmering brukar vi oftast börja att räkna ifrån noll. Arrayen värden innehåller fyra element. Elementen är indexerade ifrån 0 till 3. Sista elementet är alltså element nummer 3, dvs ett mindre än antalet element. Detta är på grund av att vi räknar ifrån noll.

Vill vi ändra på innehållet i ett element, gör vi som ovan men med den skillnad att vi gör en tilldelning till elementet, t.ex.:

värden[2] = 42;

Liksom "vanliga" variabler, kan man ändra på datatypen vid en tilldelning.

Gå igenom en array

Vi vill ofta gå igenom hela, eller delar av, arrayen och göra nåt med elementen som den innehåller. Det kan man göra på lite olika sätt...

(Som vi kommer att se så är det lite skillnad på hur dessa två sätt beter sig)

for-loop

for-loopar är en metod som vi kan använda oss av om vi vill gå igenom elementen i en array.

Varje array har en egenskap som heter length, den är satt till det antal element som finns i arrayen. Genom att använda oss av length kan vi göra en for-loop på följande vis:

for(let i = 0; i < värden.length; i++) {
   let ettVärde = värden[ i ];

   console.log(ettVärde);
}

I exemplet skriver vi alltså ut alla element i värden.

Lägg märke till att loopens test-del använder "<", dvs loopen avslutas när den är ett steg under length. Vi konstaterade ju tidigare att elementen i arrayer indexeras ifrån 0 till och med length - 1. Vilket innebär att vi vill avsluta loopen ett steg under length. När vi använder oss av <, så avslutas loopen efter man nått sista elementet.

Då man kör en for-loop för att gå igenom arrayen, kan man använda sig av de vanliga continue och break. Vi kan alltså skippa steg och fortsätta med nästa element och vi kan bryta oss ur loopen helt och hållet. Det senare kan vara bra om vi t.ex. gjort allt som behöver göras och därmed inte behöver fortsätta igenom hela arrayen. Ett exempel på detta kunde vara att vi söker efter ett specifikt värde i arrayen, när vi hittar på det kanske vi vill bryta oss ur loopen istället för att gå igenom den helt och hållet.

forEach

Ett annat sätt på vilket vi kan gå igenom en array är att använda oss av metoden forEach. Det är en metod som ingår i alla array-variabler. Vi anropar den genom att ange arraynamnet följt av .forEach(). forEach går igenom en array, element för element, och anropar en funktion för varje element.

Så här skulle föregående exempel bli att se ut om vi använder oss av forEach istället för en for-loop.

function skrivUt(n) {
  console.log(n);
}

värden.forEach(skrivUt);

forEach plockar ut varje element var för sig. Varje element som plockas ut, kommer att skickas till funktionen skrivUt. Funktionen kommer att få det utplockade elementet som input, dvs skrivUt:s n kommer att sättas till ett element-värde.

I JavaScript behandlar man funktioner som "vanliga" variabler. Vi skickar skrivUt som parameter till forEach och eftersom den inte har () efter sig, så ses den som en variabel. Skulle vi haft () efter den, skulle funktionen körts direkt.

Man kan inte använda sig av break eller continue med forEach.

Oväntade beteenden

Hur JavaScript hanterar arrayer kan ibland vara lite "konstigt". Vi ska gå igenom några exempel...

Läsa utanför arrayen

let värden = [ 1, 2, 3, 4 ];

console.log(värden[10]);

Vår array innehåller ju bara fyra värden, men vi försöker komma åt det elfte (kom ihåg att vi räknar ifrån noll). Vi kommer inte att få ett felmeddelande, istället får vi värdet undefined. JavaScript bryr sig alltså inte om att vi är "utanför" den array vi definierat. Däremot har vi ju inte satt något värde i det angivna elementet och vi får därför tillbaka undefined, vilket ju stämmer.

Skriva utanför arrayen

Vad händer om vi gör följande:

let värden = [ 1, 2, 3, 4 ];

värden[10]=5;

console.log(värden[10]);

I detta fall kommer koden att köras och vi får värdet 5 utskrivet. Vår array kommer alltså att göras större och bli att innehålla elva element. Men vad händer med de element som ligger på positionerna där vi inte angivit några värden? Vi provar:

let värden = [ 1, 2, 3, 4 ];

värden[10]=5;

console.log(värden[9]);

Vi får då utskriften undefined. Det blir ingen error, så elementet existerar. Men vi har inte satt det till något värde, därmed är det odefinierat.

Skillnad på for-loop och forEach

Om vi vill gå igenom alla element i arrayen, så kommer vi i det här fallet att få olika resultat beroende på vilken loop-typ vi använder. Vi provar en for-loop först.

for(let i = 0; i < värden.length; i++) {
   let ettVärde = värden[ i ];
   console.log(ettVärde);
}

Siffrorna 1-4 skrivs ut som vi förväntat oss. Därefter följer en del undefined, ända tills vi når femman. Det var väl vad vi förväntat oss.

Nu provar vi med en forEach-loop istället.

function SkrivUt(n) {
  console.log(n);
}

värden.forEach(SkrivUt);

Nu får vi enbart siffrorna 1-5 och vi ser inte något av de element vars värde är undefined. forEach skippar alltså över de element som inte är satta till något värde!