W3docs

JavaScript BigInt

Impara JavaScript BigInt: come creare e usare interi a precisione arbitraria, regole aritmetiche e di confronto, conversioni e casi d'uso reali con esempi eseguibili.

Introduzione a JavaScript BigInt

BigInt è un tipo primitivo integrato di JavaScript che rappresenta numeri interi di dimensione arbitraria — interi molto più grandi di quelli che il tipo Number può gestire in modo sicuro. Questa guida spiega perché BigInt esiste, come crearlo e utilizzarlo, dove eccelle (finanza, crittografia, calcoli su larga scala) e le insidie da tenere a mente.

Perché esiste BigInt

Il tipo Number di JavaScript è un valore in virgola mobile a 64 bit. Può rappresentare interi esattamente solo fino a Number.MAX_SAFE_INTEGER, che vale 2^53 - 1 (9007199254740991). Oltre tale limite, l'aritmetica ordinaria perde silenziosamente precisione:

javascript— editable

Quando hai bisogno di interi esatti più grandi di questo — ID da un database, valute nell'unità più piccola, chiavi crittografiche, fattoriali — BigInt è la soluzione.

Comprendere BigInt in JavaScript

Un BigInt è un tipo primitivo distinto da Number. L'operatore typeof restituisce "bigint" e ha le proprie regole aritmetiche.

Sintassi e creazione

Crea un BigInt aggiungendo n a un letterale intero, oppure chiamando la funzione BigInt() su un numero o una stringa.

javascript— editable

Usa la forma stringa quando il valore proviene da un input o supera ciò che un letterale numerico può esprimere in modo sicuro. Passare un numero non intero (come BigInt(1.5)) genera un RangeError.

Operazioni di base con BigInt

BigInt supporta gli stessi operatori aritmetici di Number, ma entrambi gli operandi devono essere BigInt. La divisione tronca verso zero — non esiste parte frazionaria.

javascript— editable

Nota che first / second è 2n, non 2.5 — la divisione BigInt elimina il resto invece di produrre una frazione.

Confronto tra BigInt e Number

Sebbene siano tipi diversi, BigInt e Number possono essere confrontati con operatori relazionali e l'operatore di uguaglianza debole ==. Solo l'uguaglianza stretta === distingue i tipi, perché controlla anche il tipo.

javascript— editable

Consulta gli operatori di confronto per scoprire come == e === differiscono in generale.

Limitazioni e coercizione di tipo

Pur essendo potente, BigInt presenta limitazioni specifiche rispetto al tipo Number standard:

  • Nessuna coercizione implicita nell'aritmetica: non è possibile sommare, moltiplicare ecc. un BigInt con un Number — genera un TypeError. Converti prima uno dei due lati.
  • Funzioni Math: i metodi Math standard (es. Math.sqrt(), Math.floor()) non accettano argomenti BigInt e genereranno un'eccezione.
  • Nessun più unario: +10n genera un errore — usa invece Number(10n).
  • JSON: JSON.stringify non può serializzare un BigInt e genera un TypeError; converti prima in stringa manualmente.
  • Conversione esplicita: converti tra tipi con Number(bigint) o BigInt(number). Convertire in Number può perdere precisione per valori molto grandi.
javascript— editable

Applicazioni pratiche di BigInt

La capacità di BigInt di gestire numeri grandi con precisione lo rende prezioso nei calcoli finanziari, nella crittografia e nel calcolo su larga scala.

Calcoli finanziari

Nelle applicazioni finanziarie, BigInt aiuta a evitare gli errori di arrotondamento associati ai numeri in virgola mobile.

javascript— editable

Questo esempio illustra l'uso di BigInt per l'aritmetica ad alta precisione in contesti finanziari, garantendo accuratezza nelle transazioni.

Informazione

BigInt è uno strumento essenziale nella crittografia e svolge un ruolo cruciale nella generazione di grandi numeri primi. Questi numeri sono fondamentali per i meccanismi di sicurezza degli algoritmi di cifratura, garantendo una protezione efficace dei dati.

Calcolo ad alte prestazioni

L'esempio seguente mostra l'uso di BigInt nella moltiplicazione di matrici per l'elaborazione di dati su larga scala, garantendo precisione ed efficienza. Includeremo un'implementazione completa della funzione di moltiplicazione di matrici con BigInt. Ciò comporta l'inizializzazione delle matrici, il popolamento con valori BigInt e l'esecuzione della moltiplicazione. Ecco un esempio reale passo per passo:

Passo 1: Inizializza la matrice

Per prima cosa, creiamo una funzione per inizializzare una matrice di dimensioni date con zeri BigInt.

function initializeMatrix(rows, cols) {
  let matrix = new Array(rows);
  for (let i = 0; i < rows; i++) {
    matrix[i] = new Array(cols).fill(0n);
  }
  return matrix;
}

Passo 2: Funzione di moltiplicazione di matrici

Successivamente, definiamo la funzione per eseguire la moltiplicazione di matrici. Entrambe le matrici di input devono contenere valori BigInt e anche la matrice risultante conterrà valori BigInt.

function multiplyMatrices(matrixA, matrixB) {
  if (matrixA[0].length !== matrixB.length) {
    throw new Error('Number of columns in Matrix A must equal number of rows in Matrix B');
  }

  let resultMatrix = initializeMatrix(matrixA.length, matrixB[0].length);

  for (let i = 0; i < matrixA.length; i++) {
    for (let j = 0; j < matrixB[0].length; j++) {
      let sum = 0n;
      for (let k = 0; k < matrixA[0].length; k++) {
        sum += matrixA[i][k] * matrixB[k][j];
      }
      resultMatrix[i][j] = sum;
    }
  }
  return resultMatrix;
}

Passo 3: Matrici di esempio e moltiplicazione

Infine, creiamo alcune matrici di esempio ed eseguiamo la moltiplicazione. Le matrici sono popolate con valori BigInt.

javascript— editable

Spiegazione dell'output

Questo esempio moltiplica due matrici 2x2 riempite con BigInt. L'output sarà una nuova matrice in cui ogni elemento è il risultato delle regole di moltiplicazione matriciale applicate a valori BigInt. Ecco come appare la moltiplicazione:

  • Result[0][0] = (1n * 2n) + (2n * 1n) = 2n + 2n = 4n
  • Result[0][1] = (1n * 0n) + (2n * 2n) = 0n + 4n = 4n
  • Result[1][0] = (3n * 2n) + (4n * 1n) = 6n + 4n = 10n
  • Result[1][1] = (3n * 0n) + (4n * 2n) = 0n + 8n = 8n

Questa funzionalità dimostra come BigInt possa essere utilizzato per gestire numeri grandi in calcoli complessi come la moltiplicazione di matrici, garantendo precisione e prestazioni nelle applicazioni JavaScript che richiedono elaborazioni numeriche su larga scala.

Attenzione

Usa BigInt con giudizio, poiché può influire sulle prestazioni a causa della maggiore memoria e della potenza di elaborazione richiesta rispetto ai numeri standard. Utilizzalo solo quando è necessario gestire interi molto grandi.

Buone pratiche per l'uso di BigInt in JavaScript

Quando incorpori BigInt nei tuoi progetti JavaScript, considera le seguenti buone pratiche per ottimizzare le prestazioni e la manutenibilità:

  1. Tipi di dati coerenti: evita di mescolare BigInt con altri tipi numerici. La coercizione tra BigInt e Number può portare a errori o comportamenti imprevisti. Assicurati che tutti gli operandi nei calcoli siano di tipo BigInt quando necessario.
  2. Appropriatezza del caso d'uso: usa BigInt solo quando hai a che fare con numeri al di fuori dell'intervallo sicuro per i numeri JavaScript standard. Un uso eccessivo di BigInt può comportare un overhead di prestazioni.
  3. Considerazioni sulla memoria: sebbene BigInt possa gestire numeri molto grandi, tieni presente l'utilizzo della memoria nelle tue applicazioni, specialmente in ambienti con risorse limitate.
  4. Verifica della compatibilità: prima di usare BigInt, controlla la compatibilità con l'ambiente JavaScript di destinazione, poiché i browser più vecchi o alcuni motori JavaScript potrebbero non supportarlo.
  5. Algoritmi efficienti: quando esegui operazioni con BigInt, specialmente in cicli o funzioni ricorsive, ottimizza i tuoi algoritmi per ridurre al minimo l'impatto sulle prestazioni.

Comprendere i polyfill per BigInt in JavaScript

Il tipo BigInt di JavaScript è essenziale per gestire interi molto grandi, ma non è supportato in tutti gli ambienti. Per garantire la compatibilità tra browser e motori JavaScript diversi, in particolare quelli più vecchi, l'uso di un polyfill per BigInt può essere un approccio pratico.

Cos'è il polyfilling?

Il polyfilling è una tecnica utilizzata per implementare funzionalità nei browser web che non le supportano nativamente. Consiste nell'includere uno script che aggiunge la funzionalità mancante all'ambiente JavaScript del browser, consentendo agli sviluppatori di usare funzionalità moderne senza dover aspettare che tutti gli utenti passino a browser che le supportano.

Polyfilling di BigInt

Poiché BigInt è un'aggiunta relativamente recente a JavaScript, non tutti gli ambienti lo supportano. Il polyfilling consente di usare BigInt in questi ambienti non supportati simulandone la funzionalità. Ciò può essere fondamentale per le applicazioni che richiedono calcoli ad alta precisione in ambienti in cui l'aggiornamento all'ultima versione del browser non è fattibile.

Implementare un polyfill per BigInt

Implementare un polyfill per BigInt comporta la creazione o l'inclusione di una libreria che imita il comportamento di BigInt. Ecco una semplice dimostrazione concettuale di come potrebbe essere strutturato un wrapper per polyfill:

// Conceptual demonstration only. A true BigInt polyfill is complex and impractical.
// This example uses Number conversion internally for simplicity and is not suitable 
// for production large-integer handling.
if (typeof BigInt === "undefined") {
    window.BigInt = function(value) {
        return {
            value: value,
            toString: function() { return value + "n"; },
            add: function(other) { return BigInt(Number(this.value) + Number(other.value)); },
            subtract: function(other) { return BigInt(Number(this.value) - Number(other.value)); }
        };
    };
}

Limitazioni del polyfilling di BigInt

Sebbene i polyfill possano fornire compatibilità con versioni precedenti, non sono un sostituto perfetto delle implementazioni native:

  • Prestazioni: i polyfill non possono eguagliare le prestazioni delle operazioni native di BigInt, poiché sono implementati in JavaScript anziché in codice di livello inferiore ottimizzato dai produttori di browser.
  • Complessità: replicare con precisione tutti gli aspetti di una funzionalità complessa come BigInt può essere difficile e potrebbe portare a bug o inconsistenze.
  • Manutenzione: mantenere il polyfill aggiornato con eventuali modifiche alla specifica ufficiale di BigInt richiede una manutenzione continuativa.
Informazione

Valuta l'uso di un polyfill per BigInt per abilitare la compatibilità nei browser più vecchi che non supportano BigInt nativamente. Tuttavia, tieni presente che i polyfill potrebbero non offrire le stesse prestazioni delle implementazioni native e dovrebbero essere usati come soluzione temporanea finché il supporto nativo non sarà più universalmente disponibile.

Conclusione

BigInt consente a JavaScript di rappresentare interi di qualsiasi dimensione con precisione esatta, colmando il divario lasciato dal limite sicuro a 53 bit del tipo Number. Ricorri ad esso ogni volta che un intero potrebbe superare Number.MAX_SAFE_INTEGER — ID di database di grandi dimensioni, valute nelle unità minori, valori crittografici e matematica con numeri grandi — ma mantieni Number per i calcoli quotidiani in cui contano le frazioni e i metodi Math. Ricorda la regola fondamentale: non mescolare mai BigInt e Number nell'aritmetica senza una conversione esplicita.

Argomenti correlati

Esercitazione

Pratica
Qual è il modo corretto per creare un BigInt in JavaScript?
Qual è il modo corretto per creare un BigInt in JavaScript?
Was this page helpful?