>  기사  >  웹 프론트엔드  >  indexOf Optimization_prototype 관련 프로토타입 소스코드 문자열 부분(1)에 대한 간략한 분석

indexOf Optimization_prototype 관련 프로토타입 소스코드 문자열 부분(1)에 대한 간략한 분석

WBOY
WBOY원래의
2016-05-16 17:57:17866검색

添加到String.prototype中的方法比较多,不过归结起来,大致分为下面几类:

分类 方法名 
原始能力增强               strip |  include  |  startsWith  |  endsWith |  empty |  blank
格式 camelize | capitalize |  underscore |  dasherize  | inspect          
变形 toArray |  succ  | times
替换 interpolate  | sub |  scan |  truncate | gsub
HTML处理 stripTags  | escapeHTML |  unescapeHTML
参数序列化 toQueryParams
JSON处理 unfilterJSON |  isJSON |  evalJSON |  parseJSON
脚本处理 stripScripts |  extractScripts  | evalScripts

기본적인 고유 능력 강화를 시작으로 구체적인 구현은 다음과 같으며 이해하기 쉽습니다.

코드 복사 코드는 다음과 같습니다:

(function(s){
function Strip(){
return this.replace(/^s /,'').replace(/s $/, '');
}
함수 include(패턴){
return this.indexOf(pattern) > -1;//split
}
함수 startWith(패턴) {
return this.lastIndexOf(pattern, 0) === 0;
}
function endWith(pattern) {
var d = this.length - 패턴.길이
return d; >= 0 && this.indexOf(pattern, d) === d;
}
function 비어 있음() {
return this == ''
}
함수 공백( ) {
return /^s*$/.test(this);
s.strip = String.prototype.trim || 스트립; s.startsWith = startWith;
s.empty = 비어 있음;
s.blank = 공백
})


위의 스트립은 jquery에서 $.trim인데, 대부분이 Trim인 것 같습니다. 네이티브 프로토타입을 직접 확장하는 비극은 여기서 드러납니다. 왜냐하면 트림 메소드가 후속 JS 구현(예: 크롬)에서 구현되기 때문입니다. 이는 자멸적인 일입니다.



코드 복사
코드는 다음과 같습니다. function Strip(){ return this.replace (/^s /,'').replace(/s $/,'');
}


replace(/^s /,'')는 다음과 같습니다. TrimLeft, replacement(/s $/,'')는 TrimRight이지만 이 두 메서드는 Prototype.String에서 사용할 수 없습니다.

이 부분에서 더 흥미로운 부분은 다음과 같습니다.

이 단락을 보면서 나는 startWith와 endWith에 대해 매우 혼란스러웠습니다. 논리적으로 말하면 여기서는 indexOf를 사용할 수 있습니다. lastIndexOf가 사용됩니다. 나중에 Prototype1.6 버전의 구현을 확인했습니다.




코드 복사
코드는 다음과 같습니다. function startWith(pattern) { return this.indexOf(pattern) === 0;
}

function endWith(pattern) {
var d = this.length - Pattern.length ;
return d >= 0 && this.lastIndexOf(pattern) === d
}


이전에서 startWith를 사용한 것을 볼 수 있습니다. 버전이지만 버전 1.7에서 수정되었습니다. 버전 1.7:

startsWith 구현에서 lastIndexOf는 뒤에서 앞으로 검색하지만 시작점(fromindex)이 0으로 설정되어 있으므로 시작 부분을 한 번만 감지하면 됩니다.
endsWith 구현에서는 indexOf가 문자열의 길이가 가변적이므로 여기에서 길이를 계산한 다음 시작점(fromindex)을 결정하므로 끝은 한 번만 감지하면 됩니다. .

여기서 성능 최적화는 1.6 구현에서 시작 부분에 일치 항목이 없는 경우(즉,startsWith가 설정되지 않은 경우) indexOf는 일치 항목을 찾거나 끝 부분을 찾을 때까지 계속 뒤로 검색한다는 것입니다. 문자열은 낭비입니다. 예를 들어 다음 작업의 경우:

'abcdefgabcdefg'.startsWith('abc')
버전 1.6과 버전 1.7의 구현에서는 차이가 없지만 변환해 보겠습니다.

'abcdefgabcdefg'.startsWith('xesam')
1.6 구현에서 startWith 내부의 indexOf 작업은 시작 부분의 a가 x와 일치하지 않은 후에도 계속됩니다. 계속할 필요는 없지만 indexOf는 계속됩니다. 일치하는 'xesam'을 찾을 때까지 또는 문자열이 끝날 때까지 계속해서 뒤로 검색하세요.
1.7 구현에서는 startWith 내부의 lastIndexOf를 역방향(fromIndex=0)으로 검색하므로 시작 a가 x와 일치하지 않으면 lastIndexOf가 끝에 도달했기 때문에 작업이 중지됩니다.
이 비교에서 감지할 문자열이 매우 긴 경우 두 구현 방법의 효율성에 상당한 차이가 있습니다.
endWith의 원리는 동일합니다.
성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.