ホームページ  >  記事  >  ウェブフロントエンド  >  Prototype ソースコードの簡単な分析 最適化_プロトタイプのインデックスに関連する文字列部分 (1)

Prototype ソースコードの簡単な分析 最適化_プロトタイプのインデックスに関連する文字列部分 (1)

WBOY
WBOYオリジナル
2016-05-16 17:57:17868ブラウズ

添加到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 の原理は同じです。
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。