Rekenen met getallen
In de voorbeelden hiervoor hebben we steeds gewerkt met letterlijke getallen (literals): een reeks cijfers in de programmatekst.
In dit hoofdstuk gaan we rekenen met getallen: letterlijke getallen, waarden die we berekend hebben, en parameters.
In JavaScript zijn er ook andere waarden dan getallen, bijvoorbeeld strings (tekenreeksen), booleans (logische waarden), en samengestelde waarden in de vorm van objecten en arrays. Deze waarden komen in latere hoofdstukken aan bod.
In de meeste voorbeelden gebruiken we gehele getallen. In JavaScript kan een getal ook een drijvende-komma getal zijn. In veel andere talen maak je uitdrukkelijk verschil tussen gehele getallen en drijvende-komma getallen; in JavaScript maak je dat onderscheid niet.
Een expressie (rekenkundige uitdrukking) in JavaScript bestaat uit waarden, operatoren en haakjes. Een waarde is een:
- letterlijk getal (literal):
123
,-9843
; - benoemde waarde (parameter, variabele):
size
,a
; - functie-aanroep:
sqr(3 * size)
,Math.sqrt(4)
;
De rekenoperatoren zijn +
, -
, *
, /
en %
(rest na deling).
In de expressie a + b
noemen we a
en b
ook wel de operanden van de operator +
.
Enkele voorbeelden van expressies:
2 + 3 * 4
(2 + 3) * 4
Math.sqrt(4) + 12
(-b + Math.sqrt(b * b - 4 * a * c)) / (2 * a)
Een expressie kun je zien als een rekenvoorschrift: je geeft aan hoe het resultaat uitgerekend moet worden, uit de waarden die in de expressie gebruikt worden, met behulp van de operatoren.
Een verschil met de gebruikelijke wiskundige notatie is dat je vermenigvuldiging altijd moet schrijven als
*
, bijvoorbeeld2 * a
. Je kunt dit niet afkorten als2a
.
Operatoren
We gebruiken voor getallen voorlopig de volgende operatoren:
*
"maal", vermenigvuldigen/
"gedeeld door", delen%
"modulo", rest na deling+
"plus", optellen-
"min", aftrekken
Prioriteit: rekenvolgorde
Operatoren hebben een prioriteit: deze bepaalt de rekenvolgorde, en daarmee de betekenis van de expressie. Vermenigvuldigen (*
) en delen (/
of %
) gaan voor optellen (+
) en aftrekken (-
).
Operatoren met gelijke prioriteit worden van links naar rechts uitgevoerd. a - b - c
betekent (a - b) - c
. Dit noemen we ook wel links-associatief.
Rest na deling
De operator %
(modulo: rest na deling) gebruiken we vrij vaak in onze programma's. Enkele voorbeelden:
13 % 2
geeft1
:13
is een oneven getal16 % 2
geeft0
:16
is een even getal13 % 10
geeft3
: het laatste decimale cijfer van het getal
Haakjes
Door middel van haakjes kun je de rekenvolgorde aangeven. Dit gebruik je vooral als deze volgorde afwijkt van de volgorde bepaald door de prioriteit van de operatoren.
Rekenen met functies
Als een functie een waarde als resultaat heeft, dan kun je een aanroep van een functie ook gebruiken in een expressie.
Als voorbeeld hiervan gebruiken we enkele bekende wiskundige functies. In JavaScript zijn bijvoorbeeld de volgende functies gedefinieerd:
Math.sqrt(x)
- de (vierkants)wortel vanx
Math.sin(x)
- de sinus vanx
(in radialen)Math.random()
- een willekeurig getal tussen 0 en 1 (inclusief 0, tot aan 1).
Bekende constanten zijn:
Math.PI
- de constante (3.14152965...)Math.E
- de constante (2.7182818...)Math.SQRT2
- de constante (1.41421356...)
Hiermee kunnen we bijvoorbeeld de volgende expressies maken:
Math.sin(2 * Math.PI)
- geeft (bijna) 0.Math.sqrt(144)
- geeft 1210 * Math.random() + 1
- random getal tussen 1 en 10.
Opmerking: een getal als
Math.PI
kun je niet exact voorstellen als een zwevende-komma getal: je gebruikt een benadering, met een beperkt aantal cijfers. Als je verder rekent met zo'n benadering, wordt het antwoord ook een benadering. Als je exact wilt rekenen met computers, kun je je beter beperken tot gehele getallen. valt dan buiten de boot.)
De notatie Math.xxx
leggen we later uit. Voorlopig kun je Math.sqrt
als een samengestelde naam beschouwen.
Functies met resultaat
De functies die we gebruikt hebben voor het tekenen van een figuur, geven een effect, in de vorm van een tekening op het scherm. Hieronder behandelen we "echte" functies, die een waarde opleveren als resultaat. Door middel van de opdracht return expr;
waarin expr
één of andere expressie is, geef je het functieresultaat aan.
Voorbeeld:
function dubbel(x) {
return x * 2;
}
Een aanroep van deze functie, bijvoorbeeld dubbel(10)
, levert een getal op. Overal waar een getal verwacht wordt, kunnen we een dergelijke functie-aanroep schrijven. Gebruik het volgende voorbeeld in het console:
dubbel(20) + 50
We kunnen met de bouwstenen die we hebben willekeurig ingewikkelde expressies schrijven:
dubbel(dubbel(10) + 5)) * 2
Opmerking: we schrijven hier geen
;
na de aanroep van een functie; dat is omdat het niet op een opdracht (statement) gaat, maar om een waarde. Deze waarde willen we mogelijk met andere waarden in een expressie combineren. Ook na een getal schrijven we immers geen;
.
Zoals je in dit voorbeeld ziet, kan een parameter ook een getal voorstellen, en kunnen we overal waar in een expressie een getal verwacht wordt, een parameter gebruiken.
Parameters
Een parameter is een benoemde waarde. Waar in een expressie een getal verwacht wordt, kunnen we ook een parameter schrijven. Voorbeeld:
function sqr(a) {
return a * a;
}
Omgekeerd kunnen we ook overal waar een getal verwacht wordt, een expressie schrijven. In het bijzonder geldt dit voor de parameters bij de aanroep van een functie, bijvoorbeeld:
sqr(2 * 3)
We zullen later zien dat we andere waarden als parameters kunnen gebruiken: strings, arrays, objecten, en functies.