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 *, bijvoorbeeld 2 * a. Je kunt dit niet afkorten als 2a.

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 geeft 1: 13 is een oneven getal
  • 16 % 2 geeft 0: 16 is een even getal
  • 13 % 10 geeft 3: 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 van x
  • Math.sin(x) - de sinus van x (in radialen)
  • Math.random() - een willekeurig getal tussen 0 en 1 (inclusief 0, tot aan 1).

Bekende constanten zijn:

  • Math.PI - de constante π\pi (3.14152965...)
  • Math.E - de constante ee (2.7182818...)
  • Math.SQRT2 - de constante 2\sqrt{2} (1.41421356...)

Hiermee kunnen we bijvoorbeeld de volgende expressies maken:

  • Math.sin(2 * Math.PI) - geeft (bijna) 0.
  • Math.sqrt(144) - geeft 12
  • 10 * 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. π\pi 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.