L'oggetto Math di JavaScript è la silenziosa cintura multiuso del linguaggio. Non lo istanzi mai. Non lo importi mai. Esiste semplicemente in ogni runtime, pronto a gestire tutto, dall'arrotondamento di un valore pixel alla generazione di un lancio di dadi casuale. Poiché Math è un oggetto statico, ogni metodo e proprietà è collegato direttamente al namespace. Scrivi Math.PI, non new Math().PI. Questa scelta di progettazione mantiene le cose semplici, ma significa anche che l'oggetto presenta alcuni aspetti critici che vale la pena comprendere prima di affidarvisi per la logica di produzione.
Un oggetto statico senza costruttore
La maggior parte degli oggetti integrati di JavaScript richiede la creazione di un'istanza. Chiami new Date() o new Array(). Math si rifiuta. È progettato come un namespace di funzioni e costanti correlate che operano sul tipo primitivo Number. Chiama Math.sqrt(16) e otterrai 4. Prova a usare la parola chiave new e il motore lancerà un TypeError. Questo pattern mantiene la memoria pulita e segnala che Math è puramente funzionale. Prende input, restituisce output e non muta nulla.
C'è un limite rigoroso da ricordare: Math lavora con i numeri standard IEEE 754. Non funziona con BigInt. Passa un BigInt a Math.round() o Math.abs() e otterrai un TypeError. Se la tua applicazione gestisce interi a 64 bit o superiori, devi convertirli verso il basso o gestire l'aritmetica utilizzando gli operatori nativi BigInt.
Costanti che utilizzi realmente
L'oggetto Math espone diverse costanti numeriche che ti evitano di inserire numeri magici direttamente nel codice (hard-coding).
Math.PIè il familiare 3.14159..., essenziale per tutto ciò che riguarda cerchi, trigonometria o la conversione di gradi in radianti.Math.Eè il numero di Eulero, circa 2.718. Appare nelle curve di crescita esponenziale, nei calcoli dell'interesse composto e nelle scale logaritmiche.Math.SQRT2è la radice quadrata di due, circa 1.414. È utile quando hai bisogno della diagonale di un quadrato o vuoi normalizzare i vettori in una geometria semplice.Math.LN2è il logaritmo naturale di 2, circa 0.693. Lo vedrai in algoritmi che trattano alberi binari, entropia dell'informazione o analisi della complessità temporale che coinvolgono calcoli logaritmici in base 2.
Questi valori sono float a doppia precisione. Poiché sono proprietà e non metodi, si accede a essi senza parentesi.
Arrotondamento, segni e valori assoluti
I compiti più comuni con Math riguardano la pulizia di un numero. JavaScript ti offre quattro metodi di arrotondamento, e non si comportano in modo identico, specialmente una volta usciti dal territorio dei numeri positivi.
Math.abs(x) restituisce il modulo di un numero. Passagli -42 e otterrai 42. È utile quando ti interessa la distanza piuttosto che la direzione. Pensa al confronto di timestamp, al calcolo dei delta di trascinamento in un'interfaccia utente o al controllo se un tentativo rientra in un margine di errore.
Math.round(x) è l'arrotondatore scolastico. Prende l'intero più vicino, arrotondando i valori medi verso l'intero positivo successivo. Quindi 4.4 diventa 4, e 4.5 diventa 5.
Math.ceil(x) arrotonda sempre per eccesso all'intero successivo. 4.1 diventa 5, e -4.9 diventa -4. Quest'ultimo caso sorprende le persone. Poiché -4 è maggiore di -4.9 sulla retta numerica, il "ceiling" si sposta verso lo zero per i numeri negativi.
Math.floor(x) è l'opposto. Arrotonda sempre per difetto. 4.9 diventa 4, e -4.1 diventa -5. Se stai paginando i risultati di una ricerca o allocando blocchi di memoria di dimensioni fisse, floor è solitamente ciò che desideri.
Math.trunc(x) elimina interamente la parte decimale, lasciando solo la parte intera. In effetti, si sposta verso lo zero indipendentemente dal segno. 4.9 diventa 4, e -4.9 diventa -4. Se stai portando la logica da linguaggi che convertono i float in int tramite troncamento, questo è il tuo alleato.
Infine, Math.sign(x) ti dice da quale lato dello zero si trova un valore. Restituisce 1 per i positivi, -1 per i negativi, 0 per lo zero positivo, -0 per lo zero negativo e NaN per qualsiasi cosa non sia un numero. È un modo conciso per gestire i rami in base alla direzione senza scrivere una catena if-else.
Generazione di numeri casuali
Math.random() produce un float pseudo-casuale da 0 (incluso) a 1 (escluso). Non è crittograficamente sicuro, quindi non usarlo per la generazione di password, la creazione di token o qualsiasi cosa coinvolga denaro reale.
