substr과 substring의 차이점은 무엇입니까?


844

차이점은 무엇입니까

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

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

둘 다“ab”를 출력하는 것 같습니다.


13
@Derek 朕 會 功夫 참고 substring 로 Chrome 에서 다른 모든 제품보다 늦습니다.
Steven Lu

4
@Derek 주석에 추가 ... slice방법 과 달리 substring음수 매개 변수 조정을 처리하지 않습니다.
Dzeimsas Zvirblis

1
더 중요한 질문은 "자바 스크립트에 substr메소드와 메소드 가 모두있는 이유"라고 생각합니다 substring. 이것이 실제로 선호되는 과부하 방법입니까?
Sinjai

7
오늘로서, MDN은 약 큰 빨간색 경고가 substr()여기에 해당 문서 페이지의 상단에있는 "의사 사용되지 않는"호출 할 수 있습니다 무엇 인 : developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/...를 - 누구든지 이것에 대해 더 많은 정보를 가지고 있습니까? 예를 들어 substr(), 앞으로 어떤 시점에서 실제로 폐기 될 계획이있는 브라우저가 있습니까? 또는 Steven Lu가 제안한 것처럼 substr()앞으로 사용하면 성능이 저하 될 수 있습니까?
제임스

답변:


930

차이점은 두 번째 주장에 있습니다. 두 번째 인수 substring는 중지 할 인덱스 (포함하지는 않음)이지만 두 번째 인수 substr는 반환 할 최대 길이입니다.

연결?

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

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


61
일반적인 오류 원인 인 것 같습니다. 차이점을 알게되어 반갑습니다. 이에 대한 추가 의견은 여기에서 확인하십시오 : rapd.wordpress.com/2007/07/12/javascript-substr-vs-substring
schnaader

3
당신은 문자열의 끝 (더 두 번째 인수를) 원하는없는 경우도 @Pawel
앙드레 Chalella에게

Java 애플릿을 개발하던 시절을 그리워하는 것은 너무 우스운 일입니다. ( '거의', 우리는 그때 IE에 대해 걱정해야했기 때문에.)
Michael Scheper

2
또한 첫 번째 인수에 대한 차이점을 언급해야합니다. substr의 경우 음수 일 수 있지만 (이 경우 끝에서 시작) 하위 문자열에는 해당되지 않습니다. JefferMC의 답변을 참조하십시오. 그러나 투표가 너무 적어 많은 사람들이이 중요한 부분을 놓칠 수 있습니다.
youen

2
여기까지 대부분의 upvoted 대답으로이기 때문에, 아마 포함하도록 편집해야 String.prototype.substr()그것은에 정의되어 있습니다 (...되지 않습니다 부속서 B 그은 ECMA-262 표준의 도입 상태 : "... 프로그래머가 사용하거나 가정하지 말아야 새로운 ECMAScript 코드를 작성할 때 이러한 기능과 동작이 존재합니다.… ")
TS

309

substring( MDN )은 매개 변수를로 사용 (from, to)합니다.
substr( MDN )은 매개 변수를로 사용 (from, length)합니다.

업데이트 : MDN은 substr레거시를 고려 합니다.

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

substring또 다른 문자열 추출 방법 인 slice 와 같이 인덱스 를 기억할 수 있습니다 .

0에서 시작할 때 두 방법 중 하나를 사용할 수 있습니다.


140
.substring()인덱스를 가져옵니다. 이름에 'i'가있는 유일한 사람이기 때문에 기억할 수 있습니다. .slice()인덱스도 가져옵니다.
colllin 2018 년

10
@ colllin, i 및 지수에 대한 의견은 반드시 답변으로 이동해야합니다!
MyDaftQuestions 9

35

yatima2975의 답변에서 암시 된 것처럼 추가 차이점이 있습니다.

substr()음의 시작 위치를 문자열 끝의 오프셋으로 받아들입니다. substring()하지 않습니다.

에서 MDN :

start가 음수이면 substr ()은 문자열 끝에서 문자 인덱스로 사용합니다.

기능상의 차이점을 요약하면 다음과 같습니다.

substring(begin-offset, end-offset-exclusive)시작 오프셋이 0큰 곳

substr(begin-offset, length) 시작 오프셋도 음수 일 수 있습니다.


25

내가 최근에 겪은 또 다른 문제는 IE 8에서는 "abcd".substr(-1)잘못 반환 "abcd"하지만 Firefox 3.6은 정상적으로 반환 "d"한다는 것입니다. slice둘 다에서 올바르게 작동합니다.

이 주제에 대한 자세한 내용은 여기를 참조하십시오 .


17

가장 큰 차이점은

substr ()을 사용하면 반환 할 최대 길이를 지정할 수 있습니다.

substring ()을 사용하면 인덱스를 지정할 수 있으며 두 번째 인수는 포함되지 않습니다

substr ()과 substring () 사이에는 등가 인수 및 음수 인수 처리와 같은 추가적인 미묘한 부분이 있습니다. 또한 substring ()과 slice ()는 비슷하지만 항상 같은 것은 아닙니다.

  //*** 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"        

유용한 "부정적인 두 번째 주장"을 놓쳤습니다 slice."string".slice(2,-2); // "ri"
Paul

8

차이점은 두 번째 매개 변수입니다. 두 번째 매개 변수는 두 숫자 모두 두 가지 다른 것을 기대합니다.

하위 문자열을 사용할 때 두 번째 매개 변수는 포함하지 않는 첫 번째 색인입니다.

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

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

substr을 사용할 때 두 번째 매개 변수는 하위 문자열에 포함 할 문자 수입니다.

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

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

5

큰 차이는되어 substr()있습니다 사용되지 않는 방법을 계속 사용할 수 있지만이 완전히 미래에 언젠가 제거 될 것으로 예상되기 때문에주의해서 사용해야합니다. 코드에서 사용을 제거하기 위해 노력해야합니다. 그리고 그 substring()방법은 성공했고 전자를 지정했다.


2
사용 중단을 나타내는 신뢰할 수있는 출처를 가리킬 수 substr()있습니까? 여러 사람이 읽었지만 웹에서 진술을 지원하는 정보를 찾을 수 없습니다. 또한 Mozilla는 더 이상 사용되지 않거나 더 이상 사용되지 않는 기능 목록에 포함되어 있지 않습니다. developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
DanielM

@DanielM 내가 기억하는 한,이 답변을 게시 할 때 사용되지 않았으며, 기사가 변경되어 현재 사용되지 않을 수도 있습니다 (확실하지는 않습니다) .. 그러나 여전히 sstut.com/javascript/substring- 더 이상 사용되지 않는 method.php .
5ervant

3
@DanielM는 String.prototype.substr()에 정의 된 부속서 B 그은 ECMA-262 표준의 도입 상태 : "... ECMAScript의 새로운 코드를 작성할 때 프로그래머가 사용하거나 이러한 기능과 행동의 존재를 가정하지 말아야 ...."
TS

@TS substr()는 실제로 일부 문서에서는 더 이상 사용되지 않습니다.
5ervant

2
오늘 답변이 받아 들여 져야합니다. 대안이있을 때 레거시 함수를 사용하는 것은 좋은 코드를위한 옵션이 아닙니다. Google이이 페이지로 연결될 때 더 잘 보이게하려면이 답변을 찬성하십시오.
vbezhenar


3

substring () : "start"및 "end"의 두 매개 변수가 있습니다.

  • 시작 매개 변수는 필수이며 추출을 시작할 위치를 지정합니다.
  • end 매개 변수는 선택 사항이며 추출이 끝나는 위치를 지정합니다.

end 매개 변수를 지정하지 않으면 시작 위치에서 문자열 끝까지의 모든 문자가 추출됩니다.

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

Output : Substring

start 매개 변수 값이 end 매개 변수 값보다 큰 경우이 메서드는 두 인수를 서로 바꿉니다. 이는 시작이 종료로 사용되고 종료가 시작으로 사용됨을 의미합니다.

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

Output : Substring

substr () : "start"및 "count"의 두 매개 변수가 있습니다.

  • 시작 매개 변수는 필수이며 추출을 시작할 위치를 지정합니다.

  • count 매개 변수는 선택 사항이며 추출 할 문자 수를 지정합니다.

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


Output : Substr Exa

count 매개 변수를 지정하지 않으면 시작 위치에서 문자열 끝까지 모든 문자가 추출됩니다. count가 0이거나 음수이면 빈 문자열이 반환됩니다.

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

Output : ple


2

부분 문자열 (startIndex, endIndex (포함되지 않음))

substr (startIndex, 문자 수)

const string = 'JavaScript';

console.log('substring(1,2)', string.substring(1,2)); // a
console.log('substr(1,2)', string.substr(1,2)); // av
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.