HOWTO · JavaScript

Rimuovi l'ultimo carattere dalla stringa in JavaScript

Questo tutorial insegna come rimuovere l'ultimo carattere da una stringa JavaScript.

In questa pagina

Le stringhe JavaScript sono immutabili: rimuovere un carattere non modifica la stringa originale, ma restituisce una nuova stringa senza la parte selezionata. Nel caso più comune, usa slice(0, -1): l’indice finale negativo si conta a partire dalla fine, quindi il risultato esclude l’ultima unità di codice UTF-16. Se con «carattere» intendi un simbolo percepito come tale da una persona, consulta le note sull’Unicode più avanti: un singolo simbolo può occupare più unità di codice.

Esegui questo esempio:

Il codice e le etichette o gli output visibili in questa sezione restano in inglese.

const value = 'DelftStacks';
const shortened = value.slice(0, -1);
console.log(shortened);
DelftStack

L’esempio produce DelftStack. Chiama slice() con indice iniziale 0 e indice finale pari a un’unità di codice prima della fine; il valore originale value rimane invariato.

Usa slice() per rimuovere l’ultimo carattere

slice() accetta un indice iniziale e, facoltativamente, un indice finale. L’indice finale è esclusivo: il carattere che si trova in quella posizione non viene incluso. Gli indici negativi si contano a partire dalla fine della stringa; di conseguenza, slice(0, -1) conserva tutto ciò che precede l’ultima unità di codice UTF-16. È la soluzione concisa predefinita quando vuoi ottenere questo comportamento.

Poiché le stringhe sono immutabili, assegna il valore restituito se vuoi riutilizzarlo: const shortened = value.slice(0, -1). La variabile originale continua a fare riferimento alla stringa iniziale, a meno che tu non assegni il risultato a una variabile dichiarata con let.

Usa substring() o substr() per rimuovere l’ultimo carattere

substring() accetta un indice iniziale e un indice finale esclusivo. Per omettere l’ultima unità di codice, usa value.substring(0, value.length - 1). Con un solo argomento, parte dall’indice indicato e prosegue fino alla fine: da solo, non rimuove l’ultimo carattere.

Il metodo legacy substr() accetta invece un indice iniziale e una lunghezza. Per esempio, value.substr(0, value.length - 1) richiede tutti i caratteri tranne l’ultima unità di codice. Nel nuovo codice, preferisci slice() o substring(): substr() è un’API legacy e il suo argomento indica una lunghezza, cosa che può essere facilmente confusa con un indice finale.

Usa replace() con un’espressione regolare

replace() può rimuovere il carattere finale con value.replace(/.$/, ''). In questo schema, $ ancora la corrispondenza alla fine dell’input, mentre per impostazione predefinita . corrisponde a un carattere diverso da un terminatore di riga. La sostituzione è una stringa vuota, quindi il carattere trovato viene omesso. Poiché $ può corrispondere anche subito prima di un terminatore di riga finale, se la stringa termina con un a capo questo schema può rimuovere il carattere che lo precede anziché l’a capo stesso. Quando devi rimuovere in modo coerente l’ultima unità di codice, usa un metodo per stringhe.

Gestire stringhe vuote, interruzioni di riga e caratteri Unicode

Con una stringa vuota, slice(0, -1) e substring(0, value.length - 1) restituiscono una stringa vuota: non generano errori. Anche per una stringa composta da una sola unità di codice il risultato è vuoto. Questi metodi contano le unità di codice UTF-16, come fanno gli indici delle stringhe JavaScript e la proprietà length.

La distinzione è importante per le emoji e altri simboli rappresentati da una coppia surrogata: rimuovere una sola unità di codice può lasciare un surrogato isolato, senza eliminare il simbolo intero. Se vuoi rimuovere un punto di codice Unicode, usa Array.from(value).slice(0, -1).join(''): in questo modo ogni punto di codice viene trattato come un elemento. Un grafema percepito come un singolo carattere può comunque comprendere più punti di codice, per esempio una lettera seguita da un segno combinante o una sequenza di emoji unite. In quel caso, segmenta il testo in grafemi con Intl.Segmenter e rimuovi l’ultimo segmento.

Un’interruzione di riga finale viene rimossa da slice(0, -1), che elimina l’ultima unità di codice indipendentemente dal suo valore. L’espressione regolare /.$/ si comporta diversamente, poiché per impostazione predefinita il punto non corrisponde ai terminatori di riga. Scegli il metodo in base a ciò che vuoi rimuovere: l’ultima unità di codice, un punto di codice o un grafema. Sono operazioni diverse.