Sembra esserci molta confusione che è stata affrontata solo nei commenti di elclanrs e raina77ow, quindi lasciatemi pubblicare una risposta chiarificatrice.
Una precisazione
Da " string.splice" ci si può aspettare che, come quello per gli array:
- accetta fino a 3 argomenti: posizione iniziale, lunghezza e (facoltativamente) inserimento (stringa)
- restituisce la parte tagliata
- modifica la stringa originale
Il problema è che il requisito 3d non può essere soddisfatto perché le stringhe sono immutabili (correlati: 1 , 2 ), ho trovato il commento più dedicato qui :
In JavaScript le stringhe sono tipi di valore primitivi e non oggetti ( spec ). In realtà, come di ES5, sono uno dei soli 5 tipi di valore a fianco null, undefined, numbere boolean. Le stringhe vengono assegnate per valore e non per riferimento e vengono passate come tali. Pertanto, le stringhe non sono solo immutabili, sono un valore . Cambiare la stringa "hello"in be "world"è come decidere che d'ora in poi il numero 3 è il numero 4 ... non ha senso.
Quindi, tenendo conto di questo, ci si può aspettare che la string.splicecosa " " solo:
- accetta fino a 2 argomenti: posizione iniziale, lunghezza (l'inserimento non ha senso poiché la stringa non viene modificata)
- restituisce la parte tagliata
che è ciò che substrfa; o, in alternativa,
- accetta fino a 3 argomenti: posizione iniziale, lunghezza e (facoltativamente) inserimento (stringa)
- restituisce la stringa modificata (senza la parte tagliata e con inserimento)
che è l'argomento della prossima sezione.
Soluzioni
Se ti interessa l'ottimizzazione, dovresti probabilmente utilizzare l'implementazione di Mike:
String.prototype.splice = function(index, count, add) {
if (index < 0) {
index += this.length;
if (index < 0)
index = 0;
}
return this.slice(0, index) + (add || "") + this.slice(index + count);
}
Tuttavia, il trattamento dell'indice di fuori limite può variare. A seconda delle tue esigenze, potresti volere:
if (index < 0) {
index += this.length;
if (index < 0)
index = 0;
}
if (index >= this.length) {
index -= this.length;
if (index >= this.length)
index = this.length - 1;
}
o anche
index = index % this.length;
if (index < 0)
index = this.length + index;
Se non ti interessa le prestazioni, potresti adattare il suggerimento di Kumar che è più diretto:
String.prototype.splice = function(index, count, add) {
var chars = this.split('');
chars.splice(index, count, add);
return chars.join('');
}
Prestazione
La differenza di prestazioni aumenta drasticamente con la lunghezza della corda. jsperf mostra che per stringhe con la lunghezza di 10 l'ultima soluzione (divisione e unione) è due volte più lenta della prima soluzione (usando slice), per stringhe di 100 lettere è x5 e per stringhe di 1000 lettere è x50, in Ops / sec è:
10 letters 100 letters 1000 letters
slice implementation 1.25 M 2.00 M 1.91 M
split implementation 0.63 M 0.22 M 0.04 M
nota che ho cambiato gli argomenti 1 ° e 2d quando sono passato da 10 lettere a 100 lettere (sono comunque sorpreso che il test per 100 lettere sia più veloce di quello per 10 lettere).
str.splitpotrebbe essere la funzione che stai cercando: google.com/#q=javascript+string+split