funktioniert auf allen Browsern, erfordert kein Monkey-Patching Stringund erfordert nicht das Scannen der gesamten Zeichenfolge als lastIndexOf tut, wenn es keine Übereinstimmung gibt.
Wenn Sie eine konstante Zeichenfolge abgleichen möchten, die möglicherweise Sonderzeichen für reguläre Ausdrücke enthält, z '$'dann können Sie Folgendes verwenden:
function makeSuffixRegExp(suffix, caseInsensitive) {
return new RegExp(
String(suffix).replace(/[$%()*+.?\[\\\]{|}]/g, "\\$&") + "$",
caseInsensitive ? "i" : "");
}
Das ist schön und einfach, wenn Sie nach einer konstanten Teilzeichenfolge suchen.
– Warren Blanchet
21. Mai 2009 um 22:50 Uhr
lastIndexOf scannt die gesamte Zeichenfolge? Ich dachte, es würde vom Ende bis zum Anfang suchen.
– Der Student
19. April 2011 um 16:45 Uhr
@TomBrito, lastIndexOf scannt die gesamte Zeichenfolge nur, wenn keine Übereinstimmung gefunden wird oder eine Übereinstimmung am Anfang gefunden wird. Wenn es am Ende eine Übereinstimmung gibt, funktioniert es proportional zur Länge des Suffixes. Jawohl, /asdf$/.test(str) liefert true when str endet mit "asdf".
– Mike Samuel
19. April 2011 um 16:59 Uhr
@Tom Brito, es ist ein Literal für reguläre Ausdrücke. Die Syntax ist von Perl entlehnt. Sehen developer.mozilla.org/en/Core_JavaScript_1.5_Guide/… oder für unnötige Details siehe Abschnitt 7.8.5 der EcmaScript-Sprachspezifikation.
– Mike Samuel
20. April 2011 um 16:21 Uhr
+1 für die Cross-Browser-Kompatibilität. Getestet auf Chrome 28.0.1500.72 m, Firefox 22.0 und IE9.
– Adrien Be
18. Juli 2013 um 15:06 Uhr
@Anthony, ähm … also benutze .Length-1, was ist das Problem? if (mystring.substr(mystring.length-1) === “#”) {} funktioniert gut im IE.
– BrainSlugs83
20. September 2011 um 22:47 Uhr
@BrainSlugs83 – genau das ist das Problem: Die ‘.length-1’-Syntax funktioniert im IE und die ‘-1’-Syntax nicht. Es ist etwas zu beachten, also +1 an Anthony für den Tipp.
– awramov
13. November 2011 um 18:11 Uhr
Könntest du nicht verwenden slice()? Es funktioniert für mich in meinem schnellen IE7-Test.
– Alex
8. Februar 2012 um 23:00 Uhr
verrücktes IE. wann wird es sterben?
– ahnbizcad
12. April 2016 um 21:06 Uhr
@ahnbizcad Deine Gebete wurden jetzt erhört. RIP IE
– Sankara
20. Juli 2021 um 13:31 Uhr
Oskar Liljeblad
Komm schon, das ist das Richtige endsWith Implementierung:
String.prototype.endsWith = function (s) {
return this.length >= s.length && this.substr(this.length - s.length) == s;
}
verwenden lastIndexOf erzeugt nur unnötige CPU-Schleifen, wenn es keine Übereinstimmung gibt.
Einverstanden. Ich habe wirklich das Gefühl, dass dies die leistungsfähigste Lösung ist, die angeboten wird, da sie frühe Abbrüche/Zuverlässigkeitsprüfungen enthält, kurz und prägnant ist, elegant ist (den String-Prototypen überlädt) und Teilzeichenfolgen viel weniger als Ressourcentreffer erscheinen als das Hochfahren der Regex-Engine.
– BrainSlugs83
20. September 2011 um 22:52 Uhr
Gefällt mir auch diese Lösung. Nur der Funktionsname ist falsch geschrieben. Sollte “endsWith” sein.
– xmedeko
12. Oktober 2011 um 12:23 Uhr
@BrainSlugs83 Es ist ein paar Jahre her, aber jetzt ist diese Methode nicht schneller als die oben von Chakrit erwähnte Methode „indexOf“, und unter Safari ist sie 30 % langsamer! Hier ist ein jsPerf-Test für den Fehlerfall über eine Zeichenfolge mit etwa 50 Zeichen: jsperf.com/endswithcomparison
– Brent Faust
5. Dezember 2011 um 23:28 Uhr
Sollte wahrscheinlich verwenden === obwohl.
– Timmm
10. November 2014 um 14:25 Uhr
Diese Version vermeidet das Erstellen einer Teilzeichenfolge und verwendet keine regulären Ausdrücke (einige Regex-Antworten hier funktionieren; andere sind defekt):
Wenn Ihnen Leistung wichtig ist, lohnt es sich zu testen, ob lastIndexOf ist tatsächlich schneller als das Erstellen einer Teilzeichenfolge oder nicht. (Es kann durchaus von der JS-Engine abhängen, die Sie verwenden …) Es kann im passenden Fall und bei einer kleinen Zeichenfolge schneller sein – aber wenn die Zeichenfolge sehr groß ist, muss es sogar durch das Ganze zurückblicken obwohl uns das egal ist 🙁
Um ein einzelnes Zeichen zu prüfen, die Länge zu finden und dann zu verwenden charAt ist wahrscheinlich der beste Weg.
Einverstanden. Ich habe wirklich das Gefühl, dass dies die leistungsfähigste Lösung ist, die angeboten wird, da sie frühe Abbrüche/Zuverlässigkeitsprüfungen enthält, kurz und prägnant ist, elegant ist (den String-Prototypen überlädt) und Teilzeichenfolgen viel weniger als Ressourcentreffer erscheinen als das Hochfahren der Regex-Engine.
– BrainSlugs83
20. September 2011 um 22:52 Uhr
Gefällt mir auch diese Lösung. Nur der Funktionsname ist falsch geschrieben. Sollte “endsWith” sein.
– xmedeko
12. Oktober 2011 um 12:23 Uhr
@BrainSlugs83 Es ist ein paar Jahre her, aber jetzt ist diese Methode nicht schneller als die oben von Chakrit erwähnte Methode „indexOf“, und unter Safari ist sie 30 % langsamer! Hier ist ein jsPerf-Test für den Fehlerfall über eine Zeichenfolge mit etwa 50 Zeichen: jsperf.com/endswithcomparison
– Brent Faust
5. Dezember 2011 um 23:28 Uhr
Sollte wahrscheinlich verwenden === obwohl.
– Timmm
10. November 2014 um 14:25 Uhr
Nikita Kokscharow
Ansatz mit nicht gesehen slice Methode. Also belasse ich es einfach hier:
function endsWith(str, suffix) {
return str.slice(-suffix.length) === suffix
}
Sie können es noch etwas vereinfachen: return str.slice(-1) === suffix;
– Erik K.
10. November 2015 um 14:45 Uhr
Dies ist die beste Antwort. Ich bin mir nicht sicher, warum es nicht mehr Upvotes hat.
Dies muss eine verwandte Frage sein: stackoverflow.com/questions/646628/javascript-startswith
– Hamish Grubijan
29. Januar 2013 um 17:42 Uhr
Hier ist ein vollständig spezifikationskonforme Füllwatte für ES6
String.prototype.endsWith
.– Mathias Bynens
24. April 2014 um 7:24 Uhr