添加到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의 원리는 동일합니다.