Was ist der Unterschied zwischen Teilstring und Teilstring?


844

Was ist der Unterschied zwischen

alert("abc".substr(0,2));

und

alert("abc".substring(0,2));

Beide scheinen "ab" auszugeben.


13
@Derek 朕 會 功夫 Beachten Sie, dass substring alle anderen in Chrome in letzter Zeit übertroffen werden .
Steven Lu

4
Hinzufügen zu @Derek-Kommentar ... Im Gegensatz zur sliceMethode wird substringdie Anpassung für negative Parameter nicht durchgeführt.
Dzeimsas Zvirblis

1
Ich denke, die wichtigere Frage ist: "Warum hat JavaScript sowohl eine substrMethode als auch eine substringMethode?" Dies ist wirklich die bevorzugte Methode zum Überladen?
Sinjai

7
Ab heute hat MDN eine große rote Warnung darüber substr(), was Sie als "pseudo-veraltet" bezeichnen könnten, oben auf der Dokumentseite hier: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… - Hat jemand mehr Informationen dazu, z. B. gibt es einen Browser, der plant, substr()zu einem späteren Zeitpunkt tatsächlich zu veralten ? Oder, wie Steven Lu vorschlug, könnte die zukünftige Verwendung Leistungsnachteile haben substr()?
Jamess

Antworten:


930

Der Unterschied liegt im zweiten Argument. Das zweite Argument substringist der Index, bei dem angehalten werden soll (aber nicht eingeschlossen werden soll), aber das zweite Argument substrist die maximale Länge, die zurückgegeben werden soll.

Links?

https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/String/substr

https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/String/substring


61
Klingt nach einer häufigen Fehlerquelle. Gut, den Unterschied zu kennen. Weitere Kommentare dazu hier gefunden: rapd.wordpress.com/2007/07/12/javascript-substr-vs-substring
schnaader

3
@ Pawel auch, wenn Sie es bis zum Ende der Zeichenfolge wollen (kein zweites Argument)
André Chalella

Das ist so lächerlich, dass ich die Tage der Entwicklung von Java-Applets fast vermisse. ('Fast', weil wir uns damals um IE sorgen mussten.)
Michael Scheper

2
Sie sollten auch den Unterschied im ersten Argument erwähnen, der für substr negativ sein kann (in diesem Fall beginnt er am Ende), aber nicht für substring. Siehe JefferMC Antwort, aber es hat so viel weniger Stimmen, dass viele Leute diesen wichtigen Teil verpassen könnten.
Youen

2
Da dies die mit Abstand am besten bewertete Antwort ist, sollte sie wahrscheinlich so bearbeitet werden, dass sie String.prototype.substr()die veraltete Antwort enthält ... (Sie ist in Anhang B des ECMA-262-Standards definiert, dessen Einführung besagt: "... Programmierer sollten die nicht verwenden oder annehmen Vorhandensein dieser Funktionen und Verhaltensweisen beim Schreiben eines neuen ECMAScript-Codes.… ")
TS

309

substring( MDN ) nimmt Parameter als (from, to).
substr( MDN ) nimmt Parameter als (from, length).

Update : MDN berücksichtigt substrLegacy.

alert("abc".substr(1,2)); // returns "bc"
alert("abc".substring(1,2)); // returns "b"

Sie können sich daran erinnern, dass substringIndizes verwendet werden, ebenso wie eine weitere Methode zur Zeichenfolgenextraktion, Slice .

Wenn Sie bei 0 beginnen, können Sie beide Methoden verwenden.


140
.substring()nimmt Indizes. Sie können sich erinnern, weil es das einzige mit einem 'i' im Namen ist. .slice()nimmt auch Indizes.
Colllin

10
@colllin, dieser Kommentar über das i und die Hinweise sollte sicherlich in die Antwort verschoben werden!
MyDaftQuestions

35

Wie in der Antwort von yatima2975 angedeutet, gibt es einen zusätzlichen Unterschied:

substr()akzeptiert eine negative Startposition als Versatz vom Ende der Zeichenfolge. substring()nicht.

Von MDN :

Wenn start negativ ist, verwendet substr () ihn als Zeichenindex ab dem Ende der Zeichenfolge.

Um die funktionalen Unterschiede zusammenzufassen:

substring(begin-offset, end-offset-exclusive)wobei der Anfangsversatz 0oder größer ist

substr(begin-offset, length) wobei der Anfangsversatz auch negativ sein kann


25

Ein weiteres Problem, auf das ich kürzlich gestoßen bin, ist, dass in IE 8 "abcd".substr(-1)fälschlicherweise zurückgegeben wird "abcd", während Firefox 3.6 "d"wie gewünscht zurückgegeben wird. slicefunktioniert auf beiden richtig.

Mehr zu diesem Thema finden Sie hier .


17

Der Hauptunterschied ist das

Mit substr () können Sie die maximale Länge angeben, die zurückgegeben werden soll

Mit substring () können Sie die Indizes angeben, und das zweite Argument ist NICHT inklusive

Es gibt einige zusätzliche Feinheiten zwischen substr () und substring (), z. B. die Behandlung gleicher und negativer Argumente. Beachten Sie auch, dass Teilzeichenfolge () und Slice () ähnlich, aber nicht immer gleich sind.

  //*** length vs indices:
    "string".substring(2,4);  // "ri"   (start, end) indices / second value is NOT inclusive
    "string".substr(2,4);     // "ring" (start, length) length is the maximum length to return
    "string".slice(2,4);      // "ri"   (start, end) indices / second value is NOT inclusive

  //*** watch out for substring swap:
    "string".substring(3,2);  // "r"    (swaps the larger and the smaller number)
    "string".substr(3,2);     // "in"
    "string".slice(3,2);      // ""     (just returns "")

  //*** negative second argument:
    "string".substring(2,-4); // "st"   (converts negative numbers to 0, then swaps first and second position)
    "string".substr(2,-4);    // ""
    "string".slice(2,-4);     // ""

  //*** negative first argument:
    "string".substring(-3);   // "string"        
    "string".substr(-3);      // "ing"  (read from end of string)
    "string".slice(-3);       // "ing"        

Sie haben das nützliche "negative zweite Argument" verpasst für slice:"string".slice(2,-2); // "ri"
Paul

8

Der Unterschied ist der zweite Parameter. Ihre zweiten Parameter, während beide Zahlen, erwarten zwei verschiedene Dinge:

Bei Verwendung von Teilzeichenfolgen ist der zweite Parameter der erste Index, der Folgendes nicht enthält:

var s = "string";
s.substring(1, 3); // would return 'tr'

var s = "another example";
s.substring(3, 7); // would return 'ther'

Bei Verwendung von substr ist der zweite Parameter die Anzahl der Zeichen, die in den Teilstring aufgenommen werden sollen:

var s = "string";
s.substr(1, 3); // would return 'tri'

var s = "another example";
s.substr(3, 7); // would return 'ther ex'

5

Der große Unterschied besteht darin, dass substr()es sich um eine veraltete Methode handelt , die weiterhin verwendet werden kann, jedoch mit Vorsicht angewendet werden sollte, da davon ausgegangen wird, dass sie irgendwann in der Zukunft vollständig entfernt werden. Sie sollten daran arbeiten, ihre Verwendung aus Ihrem Code zu entfernen. Und die substring()Methode war erfolgreich und spezifizierte die erstere.


2
Können Sie auf eine zuverlässige Quelle verweisen, die die Abwertung von anzeigt substr()? Ich habe es von mehreren Personen gelesen, kann jedoch im Internet keine Informationen finden, die die Aussage stützen. Außerdem nimmt Mozilla es nicht in die Liste der veralteten / veralteten Funktionen auf: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
DanielM

@ DanielM Soweit ich mich erinnere, war es veraltet, als ich diese Antwort postete. Vielleicht hat sich der Artikel geändert und ist jetzt nicht veraltet (aber nicht sicher) . Aber immer noch in einigen Artikeln wie in sstut.com/javascript/substring- aufgezeichnet. method.php als veraltet.
5ervant

3
@DanielM String.prototype.substr()ist in Anhang B des ECMA-262-Standards definiert, dessen Einführung besagt: "... Programmierer sollten diese Funktionen und Verhaltensweisen beim Schreiben eines neuen ECMAScript-Codes nicht verwenden oder annehmen. ..."
TS

@TS substr()wird in einigen Dokumenten als veraltet eingestuft.
5ervant

2
Dies sollte ab heute eine akzeptierte Antwort sein. Die Verwendung älterer Funktionen, wenn es eine Alternative gibt, ist keine Option für guten Code. Bitte stimmen Sie dieser Antwort zu, um sie besser sichtbar zu machen, wenn Google zu dieser Seite führt.
Vbezhenar


3

Teilzeichenfolge (): Es hat 2 Parameter "Start" und "Ende".

  • Der Startparameter ist erforderlich und gibt die Position an, an der die Extraktion gestartet werden soll.
  • Der Parameter end ist optional und gibt die Position an, an der die Extraktion enden soll.

Wenn der Parameter end nicht angegeben ist, werden alle Zeichen von der Startposition bis zum Ende der Zeichenfolge extrahiert.

var str = "Substring Example";
var result = str.substring(0, 10);
alert(result);

Output : Substring

Wenn der Wert des Startparameters größer als der Wert des Endparameters ist, tauscht diese Methode die beiden Argumente aus. Dies bedeutet, dass Start als Ende und Ende als Start verwendet werden.

var str = "Substring Example";
var result = str.substring(10, 0);
alert(result);

Output : Substring

substr () : Es hat 2 Parameter "start" und "count".

  • Der Startparameter ist erforderlich und gibt die Position an, an der die Extraktion gestartet werden soll.

  • Der Parameter count ist optional und gibt die Anzahl der zu extrahierenden Zeichen an.

var str = "Substr Example";
var result = str.substr(0, 10);
alert(result);


Output : Substr Exa

Wenn der Parameter count nicht angegeben wird, werden alle Zeichen von der Startposition bis zum Ende der Zeichenfolge extrahiert. Wenn count 0 oder negativ ist, wird eine leere Zeichenfolge zurückgegeben.

var str = "Substr Example";
var result = str.substr(11);
alert(result);

Output : ple


2

Teilzeichenfolge (startIndex, endIndex (nicht enthalten))

substr (startIndex, wie viele Zeichen)

const string = 'JavaScript';

console.log('substring(1,2)', string.substring(1,2)); // a
console.log('substr(1,2)', string.substr(1,2)); // av
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.