String.slice와 String.substring의 차이점은 무엇입니까?


833

이 두 방법의 차이점이 무엇인지 아는 사람이 있습니까?

String.prototype.slice
String.prototype.substring

215
JavaScript의 열악한 디자인의 예입니다. 우리는 모두 똑같은 일을하지만 세 가지 방법이있는 세 가지 방법으로 끝났습니다. IMO slice는 예상치 못한 행동을 보이는 사람입니다.
bobince

2
idx에서 끝까지 하위 문자열을 가져 오는 데 사용되는 IMO 하위 문자열을 한 눈에 더 잘 이해할 수 있습니다. 특히
멍청한 놈들

1
에 따르면 이 웹 사이트 , slice실제로 대체 할 수 substring그것을 사용 할 이유가 없다.
Derek 朕 會 功夫

5
@AmolMKulkarni 전혀 사실이 아닙니다. 시도하면로 var a = "asdf".substring(-1);취급됩니다 var a = "asdf".substring(0);. 예외는 없습니다. 그리고를 사용하면 (이전과 같이) 대신 var a = "asdf".substring(2, -1);사용 하고 인수를 교환하여 다음과 같이 작동 합니다. 나는 심지어 IE 8에서 이것을 시도하고 예외없이 결과를 얻었다0-1var a = "asdf".substring(0, 2);
Ian

35
"나는 심지어 IE 8에서 이것을 시도했습니다"-나는 프로그래밍을 좋아합니다.
quemeful

답변:


859

slice()같은 작품 substring()몇 가지 다른 행동을.

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

그들이 공통으로 가지고있는 것 :

  1. 경우 start등호 stop: 빈 문자열을 반환
  2. stop생략 된 경우 : 문자열 끝까지 문자를 추출합니다.
  3. 인수 중 하나가 문자열 길이보다 큰 경우 문자열 길이가 대신 사용됩니다.

구분 :substring()

  1. 경우 start > stop, 다음 substring사람들이 개 인자를 교환합니다.
  2. 인수가 음수이거나 NaN같으면 마치 마치 마치 마치 것처럼 취급됩니다 0.

구분 :slice()

  1. 경우 start > stop, slice()빈 문자열을 반환합니다. ( "")
  2. start음수 인 경우 : substr()Firefox에서 와 마찬가지로 문자열 끝에서 char을 설정합니다 . 이 동작은 Firefox와 IE 모두에서 관찰됩니다.
  3. stop음수 인 경우 : ECMA 사양 에서 다루는대로 string.length – Math.abs(stop)0 (thus, Math.max(0, string.length + stop))으로 제한되는 것을 제외하고 stop을 (원래 값)으로 설정합니다 .

출처 : 초보적인 프로그래밍 및 개발 기술 : 자바 스크립트 : substr () vs substring ()


8
에 마지막 주에 slice(), 그것은해야한다string.length - stop
앤디

16
에 대한 마지막 메모에서 slice()나는 그것이 (string.length – 1) + stop부정적임을 분명히하기 위해 또는 그렇게 생각해야한다고 생각합니다 .(string.length – 1) – Math.abs(stop)
Oriol

9
@Longpoke :과 String.slice일치하는 문자열 메서드가 있도록 추가되었습니다 Array.slice. substring그들은 영원히 거기에 있었으므로 그것을 깨지 않고 다른 방법을 추가했습니다. 일관성이 좋고, 2. CoffeeScript의 슬라이싱 구문이 배열과 문자열에서 작동하도록 허용하는 까다로운 결정은 거의 없습니다. @Oriol : 편집했습니다.
날으는 양

6
Firefox 22에서 하위 문자열과 슬라이스 사이에 성능 차이가있는 것 같습니다. jsperf.com/string-slice-vs-substring
Rick

4
앤디가 옳았다. 음수 이면 stop로 설정됩니다 . 마지막 문자 추출 후의 색인임을 기억하십시오 ! string.length + stopstopstop
user1537366

97

참고 : 급한 경우 또는 짧은 답변을 찾으려면 답변 맨 아래로 스크롤하여 마지막 두 줄을 읽으십시오. 서두르지 않은 경우 전체 내용을 읽으십시오.


사실을 밝히면서 시작하겠습니다.

구문 :
string.slice(start,end)
string.substr(start,length)
string.substring(start,end)
참고 # 1 :slice()==substring()

그것은 무엇입니까?
slice()메소드는 문자열의 일부를 추출하고 추출 된 부분을 새 문자열로 리턴합니다.
substr()메소드는 지정된 위치의 문자에서 시작하여 문자열의 일부를 추출하고 지정된 문자 수를 리턴합니다.
substring()메소드는 문자열의 일부를 추출하고 추출 된 부분을 새 문자열로 리턴합니다.
노트 2:slice()==substring()

원래 문자열을 변경 하시겠습니까?
slice()하지 않습니다
substr()하지 않습니다
substring()하지 않습니다
# 3 참고 :slice()==substring()

인수로 음수를 사용 :
slice()문자열의 끝부터 선택 문자
substr()문자열의 끝에서 시작하여 선택 문자
substring()수행하지 않습니다
참고 # 3 :slice()==substr()

첫 번째 인수가 두 번째 인수보다 큰 인 경우 :
slice()합니까는 수행하지
substr()두 번째 인수가 위치하지 않기 때문에,하지만 문제와 길이 값, 그것은, 평소와 같이 수행 할
substring()두 개의 인수를 교환하지 않습니다, 평소와 같이 수행

첫 번째 인수 :
slice()필수, 표시 : 시작 색인
substr()필수, 표시 : 시작 색인
substring()필수, 표시 시작 색인
참고 # 4 :slice()==substr()==substring()

두 번째 인수 :
slice()선택 사항, 추출을 종료 할 위치 (포함하지만 포함되지 않음)
substr()선택 사항, 추출 할 문자 수 선택 사항, 추출을 종료 할
substring()위치 (포함하지만 포함되지 않음)
참고 # 5 :slice()==substring()

두 번째 인수를 생략하면 어떻게됩니까?
slice()문자열
substr()의 시작 위치에서 끝까지
substring()모든 문자를 선택합니다 . 문자열 의 시작 위치에서 끝까지 모든 문자를 선택합니다 . 문자열 의 시작 위치에서 끝까지 모든 문자를 선택합니다.
주 # 6 :slice()==substr()==substring()

따라서 slice()와 사이에는 차이점이 substr()있지만 substring()기본적으로는 사본입니다 slice().

요약 :
중지 할 인덱스 (위치)를 알고 있지만 포함하지 않는 slice()
경우 추출 할 문자의 길이를 알고있는 경우 사용하십시오 substr().



24

Ben Nadel은 이것에 대해 좋은 기사를 작성했으며 매개 변수의 차이점이 다음 기능을 지적합니다.

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

또한 슬라이스 할 매개 변수가 음수이면 끝에서부터 문자열을 참조한다고 지적합니다. 하위 문자열과 하위 문자열은 그렇지 않습니다.

여기 에 대한 그의 기사가 있습니다.


3
substr은 음수 매개 변수를 처리합니다. '0123456789'.substr(-3, 2) -> '78'
닐 프레이저

14

하나의 대답은 괜찮지 만 약간의 독서가 필요합니다. 특히 새로운 용어 인 "중지"가 있습니다.

My Go-위의 Daniel의 첫 번째 답변 외에도 유용하게 사용할 수 있도록 차이점으로 구성되었습니다.

1) 음수 지수. 부분 문자열은 양의 인덱스가 필요하며 음의 인덱스는 0으로 설정됩니다. 슬라이스의 음의 인덱스는 문자열의 끝에서 위치를 의미합니다.

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

2) 인덱스 교환. 부분 문자열은 첫 번째 인덱스를 두 번째 인덱스 이하로 만들기 위해 인덱스를 재정렬합니다.

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

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

일반적인 의견-두 번째 색인이 슬라이스 또는 하위 문자열의 마지막 문자 뒤의 위치라는 것이 이상합니다. "1234".slice (2,2)가 "3"을 반환 할 것으로 예상합니다. 이로 인해 Andy의 혼란이 정당화되었습니다. "1234".slice (2, -1)이 "34"를 반환 할 것으로 예상합니다. 예, 이것은 내가 자바 스크립트를 처음 사용한다는 것을 의미합니다. 이것은 또한이 동작을 의미합니다 :

"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.

내 2c.


11

부분 문자열과 슬라이스의 차이점은 부정적이며 간과되는 해외 인수와 함께 작동하는 방식입니다.

부분 문자열 (시작, 끝)

음수 인수는 0으로 해석됩니다. 너무 큰 값은 문자열 길이로 잘립니다. alert ( "testme".substring (-2)); // "testme", -2는 0이됩니다

또한 start> end이면 인수가 서로 바뀝니다. 즉, 시작과 끝 사이에 줄거리가 반환됩니다.

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"

일부분

음수 값은 줄 끝에서 측정됩니다.

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.

이상한 논리 하위 문자열보다 훨씬 편리합니다.

substr에 대한 첫 번째 매개 변수의 음수 값은 IE8-을 제외한 모든 브라우저에서 지원됩니다.

-이 세 가지 방법 중 하나의 선택은, 대부분의 경우에 사용하는 경우가있을 것입니다 조각 : 음의 인수와는 유지하고 가장 확실한 작동합니다.


4

substr : 지정된 인덱스를 기반으로 문자열의 일부를 가져올 수 있습니다. substr-string.substr (start, end)의 구문 시작-시작 색인은 페치 시작 위치를 알려줍니다. end-end index는 문자열을 가져 오는 위치를 알려줍니다. 선택 사항입니다.

slice : 지정된 인덱스를 기반으로 문자열의 일부를 가져 오는 기능을 제공합니다. 양수와 인덱스를 지정할 수 있습니다. slice의 구문-string.slice (start, end) start-start index는 가져 오기 시작 위치를 알려줍니다. end-end index는 문자열 가져 오기 위치를 알려줍니다. 선택 사항입니다. '결합'에서 시작 및 종료 색인 모두 양수 및 음수 인덱스를 취하는 데 도움이됩니다.

문자열의 '슬라이스'에 대한 샘플 코드

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

output: crip

문자열에서 'substring'에 대한 샘플 코드

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

output: avas

[* 참고 : 음수 색인화는 문자열 끝에서 시작됩니다.]


3

slice와 substring 메소드의 유일한 차이점은 인수입니다.

둘 다 시작 / 시작 및 끝 / 끝의 두 가지 인수를 사용합니다.

서브 스트링 메소드의 첫 번째 인수로 음수 값을 전달할 수 없지만 슬라이스 메소드가이를 끝에서부터 통과합니다.

슬라이스 메소드 인수 세부 사항 :

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

인수

start_index 슬라이스가 시작될 곳의 인덱스. 값이 음수로 제공되면 마지막부터 시작한다는 의미입니다. 예 : 마지막 문자의 경우 -1 end_index 슬라이스 종료 후의 인덱스. 제공되지 않으면 슬라이스는 start_index에서 문자열 끝까지 가져옵니다. 음수 값의 경우 문자열 끝에서 색인이 측정됩니다.

부분 문자열 메소드 인수 세부 사항 :

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

인수

from 부속 문자열이 시작되는 곳에서 색인을 지정하려면 음수가 아닌 정수 여야합니다. 옵션이 아닌 음의 정수 하위 문자열이 완료되어야하기 전에 색인을 제공합니다.


0

slice(start, stop)경우 stop음수 인 경우 다음 과 stop같이 설정됩니다.

string.length  Math.abs(stop)

오히려

string.length  1  Math.abs(stop)
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.