添加到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){
functionstrip(){
return this.replace(/^s /,'').replace(/s $/, '');
}
function include(pattern){
return this.indexOf(pattern) > -1;//split
}
function startingWith(pattern) {
return this.lastIndexOf(pattern, 0) === 0;
}
関数 endWith(pattern) {
var d = this.length - pattern.length;
return d; >= 0 && this.indexOf(pattern, d) === d;
}
関数 empty() {
return this == '';
関数空白( ) {
return /^s*$/.test(this);
s.strip = String.prototype.strip ||
s.include = include; s.startsWith = 開始します;
s.empty = 空;
;
上のストリップは jquery の $.trim で、ほとんどが Trim であるようです。ここでは、ネイティブ プロトタイプを直接拡張することの悲劇が明らかになります。これは、trim メソッドが後続の JS 実装 (chrome など) に実装されるためであり、これは自滅的です。
コードをコピー
ここでの replace(/^s /,'') はTrimLeft、replace(/s $/,'') は TrimRight ですが、これら 2 つのメソッドは Prototype.String では使用できません。
この部分のより興味深い部分は次のとおりです。
この段落を見ていて、startsWith と opensWith について非常に混乱していました。論理的に言えば、startsWith には IndexOf を使用できます。 lastIndexOf が使用されます。その後、Prototype1.6 バージョンの実装を確認しました。
コードをコピーします
関数 endsWith(pattern) {
var d = this.length - pattern.length ;
return d >= 0 && this.lastIndexOf(pattern) === d;
}
前で、startsWith がindexOf を使用していることがわかります。バージョン 1.7 で変更されましたが、startsWith の実装です。バージョン 1.7:
startsWith の実装では、lastIndexOf は後ろから前に検索しますが、開始点 (fromindex) は 0 に設定されているため、先頭を 1 回検出するだけで済みます。
endsWith の実装では、indexOf は文字列の長さが可変であるため、ここで長さを計算して開始点 (fromindex) を決定するため、終了の検出は 1 回だけで済みます。 。
ここでのパフォーマンスの最適化は、1.6 実装では、先頭に一致がない場合 (つまり、startsWith が確立されていない場合)、indexOf は一致するか末尾が見つかるまで逆方向に検索します。文字列、これは無駄です。たとえば、次の操作の場合:
'abcdefgabcdefg'.startsWith('abc')
バージョン 1.6 とバージョン 1.7 の実装では違いはありませんが、変換してみましょう:
'abcdefgabcdefg'.startsWith('xesam')
1.6 実装では、startsWith 内の IndexOf 操作は、先頭の a が x と一致しなかった後も続行されますが、続行する必要はありません。一致する「xesam」が見つかるまで、または文字列の終わりまで後方検索を続けます。
1.7 の実装では、startsWith 内の lastIndexOf が逆方向 (fromIndex=0) で検索されるため、先頭の a が x と一致しなくなった後、lastIndexOf が末尾に達したため操作が停止します。
この比較では、検出する文字列が非常に長い場合、2 つの実装方法の効率に大きな差が生じます。
endsWith の原理は同じです。