Der Vollständigkeit halber habe ich mir überlegt, welche Methode ich dafür verwenden sollte. Wie in den anderen Antworten auf dieser Seite vorgeschlagen, gibt es grundsätzlich zwei Möglichkeiten, dies zu tun.
Nota: Im Allgemeinen wird die Erweiterung der eingebauten Prototypen in JavaScript nicht empfohlen. Ich biete Erweiterungen des String-Prototyps nur zur Veranschaulichung an und zeige verschiedene Implementierungen einer hypothetischen Standardmethode auf der String
eingebauter Prototyp.
Implementierung mit regulären Ausdrücken
String.prototype.replaceAll = function(search, replacement) {
var target = this;
return target.replace(new RegExp(search, 'g'), replacement);
};
Split and Join (funktionale) Implementierung
String.prototype.replaceAll = function(search, replacement) {
var target = this;
return target.split(search).join(replacement);
};
Da ich nicht allzu viel darüber weiß, wie reguläre Ausdrücke hinter den Kulissen in Bezug auf die Effizienz funktionieren, neigte ich in der Vergangenheit dazu, der Split- und Join-Implementierung den Vorzug zu geben, ohne über die Leistung nachzudenken. Als ich mich fragte, was effizienter ist und in welchem Umfang, habe ich das als Vorwand genommen, um es herauszufinden.
Auf meinem Chrome Windows 8 Rechner, die auf regulären Ausdrücken basierende Implementierung ist die schnellste , mit dem die Implementierung von Split und Join ist 53 % langsamer . Das bedeutet, dass die regulären Ausdrücke doppelt so schnell für die von mir verwendete Lorem-ipsum-Eingabe sind.
Sehen Sie sich das an Benchmark diese beiden Implementierungen gegeneinander antreten zu lassen.
Wie in dem unten stehenden Kommentar von @ThomasLeduc und anderen erwähnt, könnte es ein Problem mit der auf regulären Ausdrücken basierenden Implementierung geben, wenn search
enthält bestimmte Zeichen, die reserviert sind als Sonderzeichen in regulären Ausdrücken . Die Implementierung geht davon aus, dass der Aufrufer die Zeichenkette vorher entschlüsselt oder nur Zeichenketten übergibt, die nicht die Zeichen in der Tabelle in _Reguläre Ausdrücke_ (MDN).
MDN bietet auch eine Implementierung, um unsere Zeichenketten zu entschlüsseln. Es wäre schön, wenn dies auch standardisiert wäre als RegExp.escape(str)
aber leider gibt es sie nicht:
function escapeRegExp(str) {
return str.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); // $& means the whole matched string
}
Wir könnten anrufen escapeRegExp
innerhalb unserer String.prototype.replaceAll
Implementierung bin ich mir jedoch nicht sicher, wie sehr dies die Leistung beeinträchtigen wird (möglicherweise sogar für Zeichenketten, für die die Escape-Funktion nicht benötigt wird, wie z. B. alle alphanumerischen Zeichenketten).