elclanrs 및 raina77ow의 의견에서만 해결 된 많은 혼란이있는 것 같으므로 명확한 답변을 게시하겠습니다.
설명
" string.splice"에서 다음과 같이 예상 할 수 있습니다.
- 최대 3 개의 인수 허용 : 시작 위치, 길이 및 (선택적으로) 삽입 (문자열)
- 잘라낸 부분을 반환
- 원래 문자열을 수정합니다.
문제는 문자열이 변경 불가능하기 때문에 3d 요구 사항을 충족 할 수 없다는 것입니다 (관련 : 1 , 2 ). 여기서 가장 헌신적 인 주석을 찾았습니다 .
JavaScript에서 문자열은 객체가 아닌 원시 값 유형입니다 ( spec ). 사실, ES5의, 그들은 나란히 5 값 유형 중 하나를있어 null, undefined, number와 boolean. 문자열에 의해 할당 된 값 과 하지 참조 등으로 전달된다. 따라서 문자열은 불변 일뿐만 아니라 값 입니다. 문자열 "hello"을 변경 "world"하는 것은 지금부터 숫자 3이 숫자 4라고 결정하는 것과 같습니다.
따라서이를 고려하여 " string.splice"항목 만 다음과 같이 예상 할 수 있습니다 .
- 최대 2 개의 인수 허용 : 시작 위치, 길이 (문자열이 변경되지 않았으므로 삽입이 의미가 없음)
- 잘라낸 부분을 반환
그것이 무엇을 하는가 substr; 또는,
- 최대 3 개의 인수 허용 : 시작 위치, 길이 및 (선택적으로) 삽입 (문자열)
- 수정 된 문자열을 반환합니다 (절단 부분없이 삽입).
다음 섹션의 주제입니다.
솔루션
최적화에 관심이 있다면 Mike의 구현을 사용해야 할 것입니다.
String.prototype.splice = function(index, count, add) {
if (index < 0) {
index += this.length;
if (index < 0)
index = 0;
}
return this.slice(0, index) + (add || "") + this.slice(index + count);
}
하지만 경계를 벗어난 인덱스를 처리하는 방법은 다를 수 있습니다. 필요에 따라 다음을 원할 수 있습니다.
if (index < 0) {
index += this.length;
if (index < 0)
index = 0;
}
if (index >= this.length) {
index -= this.length;
if (index >= this.length)
index = this.length - 1;
}
또는
index = index % this.length;
if (index < 0)
index = this.length + index;
성능에 신경 쓰지 않는다면 Kumar의 제안을보다 간단하게 적용 할 수 있습니다.
String.prototype.splice = function(index, count, add) {
var chars = this.split('');
chars.splice(index, count, add);
return chars.join('');
}
공연
연주의 차이는 현의 길이에 따라 크게 증가합니다. jsperf 는 길이가 10 인 문자열의 경우 후자의 솔루션 (분할 및 결합)이 이전 솔루션 (슬라이스 사용)보다 두 배 느리고 100 자 문자열의 경우 x5이고 1000 자 문자열의 경우 x50이며 Ops /에서 초 그것은 :
10 letters 100 letters 1000 letters
slice implementation 1.25 M 2.00 M 1.91 M
split implementation 0.63 M 0.22 M 0.04 M
10 글자에서 100 글자로 이동할 때 첫 번째와 두 번째 인수를 변경했습니다 (여전히 100 글자 테스트가 10 글자 테스트보다 빠르다는 사실에 놀랐습니다).
str.split: 당신이 찾고있는 기능 수 있습니다 google.com/#q=javascript+string+split