Czy ktoś wie, jaka jest różnica między tymi dwiema metodami?
String.prototype.slice
String.prototype.substring
javascript
substring
slice
substr
tmim
źródło
źródło
slice
jest tym, którego zachowanie jest najmniej nieoczekiwane.slice
może faktycznie zastąpićsubstring
i nie ma powodu, aby z niego korzystać.var a = "asdf".substring(-1);
, zostanie to potraktowane jakovar a = "asdf".substring(0);
. Nie ma wyjątku. A jeśli używaszvar a = "asdf".substring(2, -1);
, używa0
zamiast-1
(jak poprzednio) i zamienia argumenty, aby działał jakvar a = "asdf".substring(0, 2);
. Próbowałem nawet na IE 8 i uzyskałem wyniki bez wyjątkówOdpowiedzi:
slice()
działa jaksubstring()
z kilkoma różnymi zachowaniami.Co mają ze sobą wspólnego:
start
jest równystop
: zwraca pusty ciągstop
zostanie pominięty: wyodrębnia znaki na końcu ciąguWyróżnienia :
substring()
start > stop
, tosubstring
zamieni te 2 argumenty.NaN
, jest traktowany tak, jakby był0
.Wyróżnienia :
slice()
start > stop
,slice()
zwróci pusty ciąg. (""
)start
jest ujemne: ustawia char na końcu łańcucha, dokładnie tak jaksubstr()
w Firefox. Takie zachowanie obserwuje się zarówno w przeglądarce Firefox, jak i IE.stop
jest ujemne: ustawia stop na:string.length – Math.abs(stop)
(oryginalna wartość), z wyjątkiem ograniczenia na 0 (a więcMath.max(0, string.length + stop)
) zgodnie ze specyfikacją ECMA .Źródło: Podstawowa sztuka programowania i rozwoju: JavaScript: substr () vs substring ()
źródło
slice()
powinno byćstring.length - stop
slice()
, myślę, że powinno być(string.length – 1) + stop
lub, żeby wyjaśnić, że jest negatywne,(string.length – 1) – Math.abs(stop)
String.slice
dodano, aby istniała metoda ciągów zgodna zArray.slice
.substring
był 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.stop
zostanie ustawiony nastring.length + stop
if, jeślistop
jest ujemny. Pamiętaj,stop
to indeks po wyodrębnieniu ostatniego znaku!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()
Niesubstr()
robi niesubstring()
zauważanr 3:
slice()==substring()
Używanie liczb ujemnych jako argumentu:
slice()
wybiera znaki zaczynające się od końca ciągusubstr()
wybiera znaki rozpoczynające się od końca ciągusubstring()
Nie wykonuje uwagi3:
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ówsubstring()
zamieni oba argumenty i będzie działał jak zwyklePierwszy argument:
slice()
Wymagany, wskazuje:substr()
Wymagany indeks początkowy, Wskazuje:substring()
Wymagany indeks początkowy, Wskazuje: Indeks początkowyUwaga 4:
slice()==substr()==substring()
drugi argument:
slice()
Opcjonalny, Pozycja (do, ale nie wliczając), gdzie zakończyć rozpakowaniesubstr()
Opcjonalnie, Liczba znaków do wypakowaniasubstring()
Opcjonalnie, Pozycja (do, ale bez uwzględnienia), gdzie zakończyć rozpakowywanieUwaga # 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ągusubstr()
wybiera wszystkie znaki od pozycji początkowej do końca ciągusubstring()
wybiera wszystkie znaki od pozycji początkowej do końca ciąguUwaga # 6:
slice()==substr()==substring()
więc możesz powiedzieć, że istnieje różnica między
slice()
isubstr()
, podczas gdysubstring()
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()
.źródło
Ben Nadel napisał o tym dobry artykuł, zwraca uwagę na różnicę parametrów tych funkcji:
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.
źródło
'0123456789'.substr(-3, 2) -> '78'
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.
2) Zamiana indeksów. Podciąg zmieni kolejność indeksów, aby pierwszy indeks był mniejszy lub równy drugiemu indeksowi.
--------------------------
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:
Mój 2c.
źródło
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:
plasterek
Wartości ujemne są mierzone od końca linii:
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.
źródło
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
przykładowy kod dla „substring” w ciągu
[* Uwaga: indeksowanie ujemne rozpoczyna się na końcu łańcucha.]
źródło
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ć.
źródło
Jeśli
slice(start, stop)
, jeślistop
jest ujemne,stop
zostanie ustawione na:zamiast:
źródło