Jaka jest różnica między String.slice i String.substring?


833

Czy ktoś wie, jaka jest różnica między tymi dwiema metodami?

String.prototype.slice
String.prototype.substring

215
Jest to przykład kiepskiego projektu JavaScript, w wyniku którego otrzymaliśmy trzy metody, które robią to samo, ale z różnymi dziwactwami. IMO slicejest tym, którego zachowanie jest najmniej nieoczekiwane.
bobince

2
Podciąg IMO, gdy jest używany do pobierania podciągów od idx do końca, jest bardziej zrozumiały na pierwszy rzut oka. Zwłaszcza dla
noobów

1
Według tej strony , slicemoże faktycznie zastąpić substringi nie ma powodu, aby z niego korzystać.
Derek 朕 會 功夫

5
@AmolMKulkarni W ogóle nieprawda. Jeśli spróbujesz var a = "asdf".substring(-1);, zostanie to potraktowane jako var a = "asdf".substring(0);. Nie ma wyjątku. A jeśli używasz var a = "asdf".substring(2, -1);, używa 0zamiast -1(jak poprzednio) i zamienia argumenty, aby działał jak var a = "asdf".substring(0, 2);. Próbowałem nawet na IE 8 i uzyskałem wyniki bez wyjątków
Ian

35
„Próbowałem nawet na IE 8” - uwielbiam programować.
cichy

Odpowiedzi:


859

slice()działa jak substring()z kilkoma różnymi zachowaniami.

Syntax: string.slice(start, stop);
Syntax: string.substring(start, stop);

Co mają ze sobą wspólnego:

  1. Jeśli startjest równy stop: zwraca pusty ciąg
  2. Jeśli stopzostanie pominięty: wyodrębnia znaki na końcu ciągu
  3. Jeśli jeden z argumentów jest większy niż długość łańcucha, zamiast niego zostanie użyta długość łańcucha.

Wyróżnienia :substring()

  1. Jeśli start > stop, to substringzamieni te 2 argumenty.
  2. Jeśli którykolwiek argument jest negatywny lub jest NaN, jest traktowany tak, jakby był 0.

Wyróżnienia :slice()

  1. Jeśli start > stop, slice()zwróci pusty ciąg. ( "")
  2. Jeśli startjest ujemne: ustawia char na końcu łańcucha, dokładnie tak jak substr()w Firefox. Takie zachowanie obserwuje się zarówno w przeglądarce Firefox, jak i IE.
  3. Jeśli stopjest ujemne: ustawia stop na: string.length – Math.abs(stop)(oryginalna wartość), z wyjątkiem ograniczenia na 0 (a więc Math.max(0, string.length + stop)) zgodnie ze specyfikacją ECMA .

Źródło: Podstawowa sztuka programowania i rozwoju: JavaScript: substr () vs substring ()


8
W ostatniej notatce slice()powinno byćstring.length - stop
Andy

16
W ostatniej notatce slice(), myślę, że powinno być (string.length – 1) + stoplub, żeby wyjaśnić, że jest negatywne,(string.length – 1) – Math.abs(stop)
Oriol

9
@Longpoke: String.slicedodano, aby istniała metoda ciągów zgodna z Array.slice. substringbył tam od zawsze, więc nie złamali go i dodali inną metodę. Nie jest to brzydka decyzja, ponieważ 1. spójność jest przyjemna, a 2. pozwala składni krojenia CoffeeScript działać na tablicach i ciągach. @Oriol: edytował to w.
latające owce

6
Wygląda na to, że w Firefox 22. występuje
Rick

4
Andy miał rację. stopzostanie ustawiony na string.length + stopif, jeśli stopjest ujemny. Pamiętaj, stopto indeks po wyodrębnieniu ostatniego znaku!
user1537366,

97

Uwaga: jeśli się spieszysz i / lub szukasz krótkiej odpowiedzi, przewiń na dół odpowiedzi i przeczytaj ostatnie dwa wiersze. Jeśli nie spieszysz się, przeczytaj całość.


zacznę od podania faktów:

Składnia:
string.slice(start,end)
string.substr(start,length)
string.substring(start,end)
Uwaga 1:slice()==substring()

Co to robi?
W slice()części ekstrakty Sposób struny i wraca wyodrębnione części w nowym tekstem.
W substr()części ekstrakty metoda łańcucha znaków, począwszy od znaku w określonym położeniu i zwraca określoną liczbę znaków.
W substring()części ekstrakty Sposób struny i wraca wyodrębnione części w nowym tekstem.
Uwaga 2:slice()==substring()

Zmienia oryginalny ciąg?
slice()Nie
substr()robi nie
substring()zauważa
nr 3:slice()==substring()

Używanie liczb ujemnych jako argumentu:
slice()wybiera znaki zaczynające się od końca ciągu
substr()wybiera znaki rozpoczynające się od końca ciągu
substring()Nie wykonuje uwagi
3:slice()==substr()

jeśli pierwszy argument jest większy niż drugi:
slice()nie działa,
substr()ponieważ drugi argument NIE jest pozycją, ale wartością długości, będzie działał jak zwykle, bez problemów
substring()zamieni oba argumenty i będzie działał jak zwykle

Pierwszy argument:
slice()Wymagany, wskazuje:
substr()Wymagany indeks początkowy, Wskazuje:
substring()Wymagany indeks początkowy, Wskazuje: Indeks początkowy
Uwaga 4:slice()==substr()==substring()

drugi argument:
slice()Opcjonalny, Pozycja (do, ale nie wliczając), gdzie zakończyć rozpakowanie
substr()Opcjonalnie, Liczba znaków do wypakowania
substring()Opcjonalnie, Pozycja (do, ale bez uwzględnienia), gdzie zakończyć rozpakowywanie
Uwaga # 5:slice()==substring()

Co się stanie, jeśli drugi argument zostanie pominięty?
slice()wybiera wszystkie znaki od pozycji początkowej do końca ciągu
substr()wybiera wszystkie znaki od pozycji początkowej do końca ciągu
substring()wybiera wszystkie znaki od pozycji początkowej do końca ciągu
Uwaga # 6:slice()==substr()==substring()

więc możesz powiedzieć, że istnieje różnica między slice()i substr(), podczas gdy substring()jest w zasadzie kopią slice().

Podsumowując:
jeśli znasz indeks (pozycję), na którym się zatrzymasz (ale NIE obejmuje), użyj, slice()
jeśli znasz długość znaków do wyodrębnienia, użyj substr().



24

Ben Nadel napisał o tym dobry artykuł, zwraca uwagę na różnicę parametrów tych funkcji:

String.slice( begin [, end ] )
String.substring( from [, to ] )
String.substr( start [, length ] )

Wskazuje również, że jeśli parametry do krojenia są ujemne, odnoszą się do ciągu od końca. Podciąg i substrat nie.

Oto jego artykuł na ten temat.


3
Jest to niepoprawne, substr obsługuje parametry ujemne. '0123456789'.substr(-3, 2) -> '78'
Neil Fraser

14

Jedna odpowiedź jest w porządku, ale wymaga trochę czytania. Zwłaszcza z nową terminologią „stop”.

My Go - uporządkowane według różnic, aby było przydatne oprócz pierwszej odpowiedzi Daniela powyżej:

1) indeksy ujemne. Podciąg wymaga indeksów dodatnich i ustawi indeks ujemny na 0. Indeks ujemny wycinka oznacza pozycję od końca łańcucha.

"1234".substring(-2, -1) == "1234".substring(0,0) == ""
"1234".slice(-2, -1) == "1234".slice(2, 3) == "3"

2) Zamiana indeksów. Podciąg zmieni kolejność indeksów, aby pierwszy indeks był mniejszy lub równy drugiemu indeksowi.

"1234".substring(3,2) == "1234".substring(2,3) == "3"
"1234".slice(3,2) == ""

--------------------------

Komentarz ogólny - Wydaje mi się dziwne, że drugi indeks jest pozycją po ostatnim znaku wycinka lub podłańcucha. Oczekiwałbym, że „1234” .slice (2,2) zwróci „3”. To uzasadnia powyższe zamieszanie Andy'ego - oczekiwałbym, że „1234” .slice (2, -1) zwróci „34”. Tak, oznacza to, że jestem nowy w Javascript. Oznacza to również takie zachowanie:

"1234".slice(-2, -2) == "", "1234".slice(-2, -1) == "3", "1234".slice(-2, -0) == "" <-- you have to use length or omit the argument to get the 4.
"1234".slice(3, -2) == "", "1234".slice(3, -1) == "", "1234".slice(3, -0) == "" <-- same issue, but seems weirder.

Mój 2c.


11

Różnica między podciągiem a plasterkiem - polega na tym, jak działają one z argumentami negatywnymi i pomijającymi linie za granicą:

substring (początek, koniec)

Argumenty ujemne są interpretowane jako zero. Zbyt duże wartości są obcinane do długości łańcucha: alert („testme” .substring (-2)); // „testme”, -2 staje się 0

Ponadto, jeśli start> koniec, argumenty są zamienione, tzn. Linia wykresu zwraca między początkiem a końcem:

alert ( "testme" .substring (4, -1)); // "test"
// -1 Becomes 0 -> got substring (4, 0)
// 4> 0, so that the arguments are swapped -> substring (0, 4) = "test"

plasterek

Wartości ujemne są mierzone od końca linii:

alert ( "testme" .slice (-2)); // "me", from the end position 2
alert ( "testme" .slice (1, -1)); // "estm", from the first position to the one at the end.

Jest to o wiele wygodniejsze niż dziwne logiczne podciągi.

Ujemna wartość pierwszego parametru do substr obsługiwana we wszystkich przeglądarkach oprócz IE8-.

Jeśli wybór jednej z tych trzech metod, do zastosowania w większości sytuacji - będzie to pokrojone : argumenty negatywne i utrzymuje i działa najbardziej oczywiste.


4

substr: Zapewnia nam pobranie części ciągu na podstawie określonego indeksu. składnia substr-string.substr (start, end) start - indeks początkowy mówi, gdzie rozpoczyna się pobieranie. indeks końca - końca informuje do miejsca, w którym ciągi się łańcuch. To jest opcjonalne.

plasterek: zapewnia pobranie części ciągu na podstawie określonego indeksu. Pozwala nam to określić wartość dodatnią i indeks. składnia slice - string.slice (start, end) start - indeks początkowy mówi, gdzie rozpoczyna się pobieranie, a indeks końcowy - informujący do góry, gdzie pobierany jest łańcuch. To jest opcjonalne. W „splice” zarówno indeks początkowy, jak i końcowy pomaga przyjąć indeks dodatni i ujemny.

przykładowy kod „plasterka” w ciągu

var str="Javascript";
console.log(str.slice(-5,-1));

output: crip

przykładowy kod dla „substring” w ciągu

var str="Javascript";
console.log(str.substring(1,5));

output: avas

[* Uwaga: indeksowanie ujemne rozpoczyna się na końcu łańcucha.]


3

Jedyną różnicą między metodą wycinka a metodą podciągania są argumenty

Oba przyjmują dwa argumenty, np. Początek / od i koniec / do.

Nie można przekazać wartości ujemnej jako pierwszego argumentu dla metody podciągania , ale dla metody wycinania , aby przejść przez nią od końca.

Szczegóły argumentu metody wycinania:

ODNIESIENIE: http://www.thesstech.com/javascript/string_slice_method

Argumenty

start_index Indeks, od którego powinien zacząć się plasterek. Jeśli wartość jest podana w negatywie, oznacza to, że zaczyna się od ostatniego. np. -1 dla ostatniego znaku. end_index Indeks po końcu wycinka. Jeśli nie zostanie podany, wycinek zostanie pobrany od początku_indeksu do końca łańcucha. W przypadku wartości ujemnej wskaźnik będzie mierzony od końca łańcucha.

Szczegóły argumentu metody podciągu:

ODNIESIENIE: http://www.thesstech.com/javascript/string_substring_method

Argumenty

from To powinna być nieujemna liczba całkowita określająca indeks, od którego powinien zaczynać się podłańcuch. na opcjonalną nieujemną liczbę całkowitą w celu zapewnienia indeksu, przed którym podciągu należy zakończyć.


0

Jeśli slice(start, stop), jeśli stopjest ujemne, stopzostanie ustawione na:

string.length  Math.abs(stop)

zamiast:

string.length  1  Math.abs(stop)
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.