Jaka jest różnica między substr a substring?

844

Jaka jest różnica pomiędzy

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

i

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

Oba wydają się wydawać „ab”.

Różnica silnika
źródło
13
@Derek 朕 會 功夫 Uwaga, później substring przewyższa wszystkie inne przeglądarki Chrome .
Steven Lu,
4
Dodanie do komentarza @Derek ... W przeciwieństwie do slicemetody, substringnie obsługuje korekty parametrów ujemnych.
Dzeimsas Zvirblis
1
Myślę, że ważniejszym pytaniem jest „dlaczego JavaScript ma zarówno substrmetodę, jak i substringmetodę”? Czy to naprawdę preferowana metoda przeciążania?
Sinjai
7
Na dzień dzisiejszy MDN ma duże czerwone ostrzeżenie o substr()byciu czymś, co możesz nazwać „pseudo-przestarzałym” u góry strony z dokumentami tutaj: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… - Czy ktoś ma więcej informacji na ten temat, np. Czy istnieje jakakolwiek przeglądarka, która planuje wycofać się substr()w dowolnym momencie w przyszłości? Lub, jak zasugerował Steven Lu, czy korzystanie z substr()przyszłości może mieć wady wydajności ?
jamess

Odpowiedzi:

930

Różnica polega na drugim argumencie. Drugim argumentem substringjest indeks, na którym należy się zatrzymać (ale nie obejmuje), ale drugim argumentem substrjest maksymalna długość do zwrócenia.

Spinki do mankietów?

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

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

Delan Azabani
źródło
61
Brzmi jak typowe źródło błędu. Dobrze poznać różnicę. Znaleziono dodatkowe komentarze na ten temat tutaj: rapd.wordpress.com/2007/07/12/javascript-substr-vs-substring
schnaader
3
@Pawel również wtedy, gdy chcesz, aby był na końcu łańcucha (bez drugiego argumentu)
André Chalella,
Jest to tak niedorzeczne, że prawie tęsknię za czasami tworzenia apletów Java. („Prawie”, bo wtedy musieliśmy się martwić o IE.)
Michael Scheper,
2
Należy również wspomnieć o różnicy w pierwszym argumencie, który może być ujemny dla substr (w którym to przypadku zaczyna się od końca), ale nie dla substring. Zobacz odpowiedź JefferMC, ale ma ona o tyle mniej głosów, że wiele osób może przegapić tę ważną część.
youen
2
Ponieważ jest to zdecydowanie najbardziej pozytywna odpowiedź, należy ją zredagować tak, aby zawierała String.prototype.substr()przestarzałą ... (Jest zdefiniowana w załączniku B normy ECMA-262, której wprowadzenie stanowi: „… Programiści nie powinni używać ani zakładać, że istnienie tych cech i zachowań podczas pisania nowego kodu ECMAScript.… ”)
TS
309

substring( MDN ) przyjmuje parametry jako (from, to).
substr( MDN ) przyjmuje parametry jako (from, length).

Aktualizacja : MDN uważa starszą substrwersję.

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

Możesz pamiętać, że substringpobiera indeksy, podobnie jak kolejna metoda wyodrębniania ciągów, wycinanie .

Zaczynając od 0, możesz użyć dowolnej metody.

Colin Hebert
źródło
140
.substring()bierze indeksy. Możesz pamiętać, ponieważ jest to jedyny z literą „i” w nazwie. .slice()bierze też indeksy.
colllin
10
@Colllin, ten komentarz do i i na pewno powinien zostać przeniesiony do odpowiedzi!
MyDaftQuestions,
35

Jak wskazano w odpowiedzi yatima2975, istnieje dodatkowa różnica:

substr()przyjmuje ujemną pozycję początkową jako przesunięcie od końca łańcucha. substring()nie.

Z MDN :

Jeśli start jest ujemny, substr () używa go jako indeksu znaków od końca łańcucha.

Podsumowując różnice funkcjonalne:

substring(begin-offset, end-offset-exclusive)gdzie początek-przesunięcie jest 0większe lub większe

substr(begin-offset, length) gdzie offset początkowy może być również ujemny

JefferMC
źródło
25

Innym problemem, z którym ostatnio się spotkałem, jest to, że w IE 8 "abcd".substr(-1)błędnie powraca "abcd", a Firefox 3.6 powraca "d"tak, jak powinien. slicedziała poprawnie na obu.

Więcej na ten temat można znaleźć tutaj .

yatima2975
źródło
17

Główną różnicą jest to

substr () pozwala określić maksymalną długość do zwrócenia

substring () pozwala określić indeksy, a drugi argument NIE jest włącznie

Istnieją pewne dodatkowe subtelności między substr () i substring (), takie jak obsługa argumentów równych i argumentów ujemnych. Zauważ też, że substring () i slice () są podobne, ale nie zawsze takie same.

  //*** 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"        
Nate Lipp
źródło
Przegapiłeś użytecznej „negatywne” dla drugiego argumentu slice:"string".slice(2,-2); // "ri"
Paul
8

Różnica jest drugim parametrem. Ich drugie parametry, podczas gdy obie liczby, oczekują dwóch różnych rzeczy:

W przypadku korzystania z podciągów drugi parametr jest pierwszym indeksem, który nie obejmuje:

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

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

W przypadku używania substr drugi parametr to liczba znaków, które należy uwzględnić w substring:

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

var s = "another example";
s.substr(3, 7); // would return 'ther ex'
CurnalCurz
źródło
5

Duża różnica polega na tym, że substr()jest to przestarzała metoda, której można nadal używać, ale powinna być stosowana ostrożnie, ponieważ oczekuje się, że zostaną w przyszłości całkowicie usunięte. Powinieneś pracować, aby usunąć ich użycie z kodu. A substring()metoda udało i określone byłego jeden.

5ervant
źródło
2
Czy możesz wskazać wiarygodne źródło, które wskazuje na wycofanie substr()? Przeczytałem go od kilku osób, ale nie mogę znaleźć w Internecie żadnych informacji, które mogłyby wspierać to oświadczenie. Ponadto Mozilla nie umieszcza go na liście przestarzałych / przestarzałych funkcji: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
DanielM
@DanielM O ile pamiętam, było przestarzałe, kiedy publikuję tę odpowiedź, być może artykuł zmienił się i nie jest już przestarzały (ale nie jestem pewien) .. Ale nadal jest nagrywany w niektórych artykułach, takich jak sstut.com/javascript/substring- method.php jako przestarzałe.
sierpnia 19
3
@DanielM String.prototype.substr()jest zdefiniowany w załączniku B do standardu ECMA-262, którego wprowadzenie stanowi: „… Programiści nie powinni używać ani zakładać istnienia tych cech i zachowań podczas pisania nowego kodu ECMAScript.…”
TS
@TS substr()jest naprawdę uważany za przestarzały w niektórych dokumentach.
5
2
To powinna być przyjęta odpowiedź na dziś. Używanie starszych funkcji, gdy istnieje alternatywa, nie jest opcją dla dobrego kodu. Uprzejmie głosuj tę odpowiedź, aby była bardziej widoczna, gdy Google prowadzi do tej strony.
vbezhenar
4

Metody plasterek vs Substr vs Substring vs []

Każda z tych metod javascript ma zalety związane z wydajnością. Proszę korzystać z tych funkcji odpowiednio.

Ali007
źródło
9
Ta odpowiedź byłaby lepsza, gdyby zawierała tutaj tekst podsumowujący ustalenia dotyczące powiązanych korzyści w zakresie wydajności.
2540625,
3

substring (): Ma 2 parametry „start” i „end”.

  • parametr początkowy jest wymagany i określa pozycję, od której należy rozpocząć ekstrakcję.
  • parametr końcowy jest opcjonalny i określa pozycję, w której ekstrakcja powinna się zakończyć.

Jeśli parametr końcowy nie zostanie określony, wszystkie znaki od pozycji początkowej do końca ciągu zostaną wyodrębnione.

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

Output : Substring

Jeśli wartość parametru początkowego jest większa niż wartość parametru końcowego, ta metoda zamieni oba argumenty. Oznacza to, że początek zostanie użyty jako koniec, a koniec zostanie użyty jako początek.

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

Output : Substring

substr () : Ma 2 parametry „start” i „count”.

  • parametr początkowy jest wymagany i określa pozycję, od której należy rozpocząć ekstrakcję.

  • parametr count jest opcjonalny i określa liczbę znaków do wyodrębnienia.

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


Output : Substr Exa

Jeśli parametr count nie zostanie określony, wszystkie znaki od pozycji początkowej do końca ciągu zostaną wyodrębnione. Jeśli liczba wynosi 0 lub jest ujemna, zwracany jest pusty ciąg.

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

Output : ple

raju poloju
źródło
2

substring (startIndex, endIndex (brak w zestawie))

substr (startIndex, ile znaków)

const string = 'JavaScript';

console.log('substring(1,2)', string.substring(1,2)); // a
console.log('substr(1,2)', string.substr(1,2)); // av
Sajith Mantharath
źródło