Es scheint eine Menge Verwirrung zu geben, die nur in Kommentaren von elclanrs und raina77ow angesprochen wurde. Lassen Sie mich daher eine klarstellende Antwort posten.
Klärung
Von " string.splice" kann man erwarten, dass es, wie das für Arrays:
- akzeptiert bis zu 3 Argumente: Startposition, Länge und (optional) Einfügung (Zeichenfolge)
- Gibt den ausgeschnittenen Teil zurück
- Ändert die ursprüngliche Zeichenfolge
Das Problem ist, dass die 3D-Anforderung nicht erfüllt werden kann, da Zeichenfolgen unveränderlich sind (siehe: 1 , 2 ). Ich habe hier den engagiertesten Kommentar gefunden :
In JavaScript sind Zeichenfolgen primitive Werttypen und keine Objekte ( spec ). In der Tat, wie von ES5, sie sind eine der nur fünf Werttypen neben null, undefined, numberund boolean. Zeichenfolgen werden nach Wert und nicht nach Referenz zugewiesen und als solche übergeben. Strings sind also nicht nur unveränderlich, sie sind ein Wert . Die Zeichenfolge ändern "hello"zu sein "world"ist wie die von nun an die Nummer 3 der Entscheidung ist die Nummer 4 ... es macht keinen Sinn.
In Anbetracht dessen kann man erwarten, dass das " string.splice" Ding nur:
- akzeptiert bis zu 2 Argumente: Startposition, Länge (Einfügen macht keinen Sinn, da die Zeichenfolge nicht geändert wird)
- Gibt den ausgeschnittenen Teil zurück
was ist was substrtut; oder alternativ,
- akzeptiert bis zu 3 Argumente: Startposition, Länge und (optional) Einfügung (Zeichenfolge)
- Gibt die geänderte Zeichenfolge zurück (ohne den geschnittenen Teil und mit Einfügung).
Das ist das Thema des nächsten Abschnitts.
Lösungen
Wenn Sie sich für die Optimierung interessieren, sollten Sie wahrscheinlich die Implementierung von Mike verwenden:
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);
}
Die Behandlung des Index außerhalb der Grenzen kann jedoch variieren. Abhängig von Ihren Anforderungen möchten Sie möglicherweise:
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;
}
oder auch
index = index % this.length;
if (index < 0)
index = this.length + index;
Wenn Sie sich nicht für die Leistung interessieren, können Sie Kumars Vorschlag anpassen, der einfacher ist:
String.prototype.splice = function(index, count, add) {
var chars = this.split('');
chars.splice(index, count, add);
return chars.join('');
}
Performance
Der Leistungsunterschied nimmt mit der Länge der Saite drastisch zu. jsperf zeigt , dass für Strings mit einer Länge von 10 die letztere Lösung (Teilen und Verbinden) doppelt so langsam ist wie die erstere Lösung (mit Slice), für Strings mit 100 Buchstaben x5 und für Strings mit 1000 Buchstaben x50 in Ops / sek es ist:
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
Beachten Sie, dass ich das 1. und 2. Argument geändert habe, als ich von 10 Buchstaben auf 100 Buchstaben verschoben habe (trotzdem bin ich überrascht, dass der Test für 100 Buchstaben schneller abläuft als der für 10 Buchstaben).
str.splitkönnte die Funktion sein, die Sie suchen: google.com/#q=javascript+string+split