Het Math-object van JavaScript is de stille gereedschapskist van de taal. Je instantiëert het nooit. Je importeert het nooit. Het is simpelweg aanwezig in elke runtime, klaar om alles af te handelen, van het afronden van een pixelwaarde tot het genereren van een willekeurige dobbelsteenworp. Omdat Math een statisch object is, hangt elke methode en eigenschap direct aan de namespace. Je schrijft Math.PI, niet new Math().PI. Die ontwerpkeuze houdt de boel eenvoudig, maar het betekent ook dat het object een paar valkuilen heeft die het waard zijn om te begrijpen voordat je erop vertrouwt voor productielogica.

Een statisch object zonder constructor

De meeste ingebouwde JavaScript-objecten willen dat je een instantie maakt. Je roept new Date() of new Array() aan. Math weigert dit. Het is ontworpen als een namespace van gerelateerde functies en constanten die opereren op het primitieve Number-type. Roep Math.sqrt(16) aan en je krijgt 4. Probeer het new-trefwoord te gebruiken en de engine gooit een TypeError. Dit patroon houdt het geheugen schoon en geeft aan dat Math puur functioneel is. Het neemt inputs in, geeft outputs terug en muteert niets.

Er is één strikte beperking om te onthouden: Math werkt met standaard IEEE 754-getallen. Het werkt niet met BigInt. Geef een BigInt door aan Math.round() of Math.abs() en je krijgt een TypeError. Als je applicatie werkt met 64-bits integers of groter, moet je deze converteren of de rekenkunde afhandelen met native BigInt-operators.

Constanten die je daadwerkelijk gebruikt

Het Math-object biedt verschillende numerieke constanten die je behoeden voor het hardcoderen van "magic numbers".

  • Math.PI is de bekende 3.14159..., essentieel voor alles wat te maken heeft met cirkels, trigonometrie of het omzetten van graden naar radialen.
  • Math.E is het getal van Euler, ongeveer 2.718. Het komt voor in exponentiële groeicurves, berekeningen van samengestelde rente en logaritmische schalen.
  • Math.SQRT2 is de vierkantswortel van twee, ongeveer 1.414. Het is handig wanneer je de diagonaal van een vierkant nodig hebt of vectoren wilt normaliseren in eenvoudige meetkunde.
  • Math.LN2 is de natuurlijke logaritme van 2, ongeveer 0.693. Dit zie je in algoritmen die te maken hebben met binaire bomen, informatie-entropie of complexiteitsanalyses met logaritmen met grondtal 2.

Deze waarden zijn volledige double-precision floats. Omdat het eigenschappen zijn en geen methoden, heb je er toegang toe zonder haakjes.

Afronden, tekens en absolute waarden

De meest voorkomende Math-taken hebben betrekking op het opschonen van een getal. JavaScript biedt vier afrondingsmethoden, en ze gedragen zich niet identiek, vooral niet zodra je het positieve gebied verlaat.

Math.abs(x) geeft de grootte (magnitude) van een getal terug. Geef -42 door en je krijgt 42. Het is nuttig wanneer je meer geïnteresseerd bent in afstand dan in richting. Denk aan het vergelijken van tijdstempels, het berekenen van drag-delta's in een UI, of het controleren of een gok binnen een foutmarge valt.

Math.round(x) is de standaard afrondmethode. Het neemt het dichtstbijzijnde gehele getal, waarbij halve getallen naar boven worden afgerond naar het volgende positieve gehele getal. Dus 4.4 wordt 4, en 4.5 wordt 5.

Math.ceil(x) rondt altijd naar boven af naar het volgende gehele getal. 4.1 wordt 5, en -4.9 wordt -4. Dat laatste verrast mensen vaak. Omdat -4 groter is dan -4.9 op de getallenlijn, beweegt ceiling bij negatieve getallen richting nul.

Math.floor(x) is het tegenovergestelde. Het rondt altijd naar beneden af. 4.9 wordt 4, en -4.1 wordt -5. Als je zoekresultaten paginateert of geheugenblokken van vaste grootte toewijst, is floor meestal wat je wilt.

Math.trunc(x) verwijdert het decimale deel volledig, waardoor alleen het gehele deel overblijft. In feite beweegt het naar nul, ongeacht het teken. 4.9 wordt 4, en -4.9 wordt -4. Als je logica portteert van talen die floats naar ints converteren door te truncaten, dan is dit je vriend.

Ten slotte vertelt Math.sign(x) aan welke kant van nul een waarde staat. Het geeft 1 terug voor positief, -1 voor negatief, 0 voor positieve nul, -0 voor negatieve nul, en NaN voor alles wat geen getal is. Het is een beknopte manier om op richting te selecteren zonder een if-else-keten te schrijven.

Het genereren van willekeurige getallen

Math.random() produceert een pseudo-willekeurig float-getal van 0 (inclusief) tot 1 (exclusief). Het is niet cryptografisch veilig, dus gebruik het niet voor het genereren van wachtwoorden, het aanmaken van tokens of iets dat met echt geld te maken heeft.