プロトタイプのソースコードの文字列部分の簡単な分析(2)_プロトタイプ

WBOY
リリース: 2016-05-16 17:57:11
オリジナル
957 人が閲覧しました
格式 camelize | capitalize |  underscore |  dasherize  | inspect          
变形 toArray |  succ  | times
ここで便利なメソッドは、inspect です。リファレンス マニュアルによると、その機能は「デバッグ用の文字列の文字列表現を返す (つまり、一重引用符または二重引用符で囲み、特殊文字を検査するには '' を使用します。エスケープ)」とあります。 」のように、このメソッドはオブジェクトの toJSON にも関与します。

これにはエスケープする必要がある文字が含まれるため、エスケープ文字情報のコピーが当然必要になります。これはすぐ下に示されています。
コードをコピー コードは次のとおりです:

String.specialChar = {
'b': '\b',
't': '\ t'、
'n': '\n'、
'f': '\f'、
'r': '\r'、
'\': '\\'
}

[JSON.js では、余分な '"' が存在します。これは、JSON の文字列に "" を含めることができないため、エスケープする必要があります。

もちろん、最初のステップは特殊なエスケープ文字を置き換えることです。初期バージョン:
コードをコピー コードは次のとおりです。

function Inspection () {
return this.replace(/[btnfr\]/,function(a){
return String.specialChar[a];
}) ;
}

JSON 形式の場合は、二重引用符が必要であるため、独自の戻り形式を選択できる必要があります。そのため、デフォルトでは useDoubleQuotes を使用します。文字列を返すには引用符で囲みます。
コードをコピーします コードは次のとおりです。

function Inspection(useDoubleQuotes) {
varscapeString = this.replace(/[btnfr\]/,function(a){
return String.specialChar[a];
});
if (useDoubleQuotes){
return '" ' エスケープ文字列.replace(/"/g, '\"') '"';
}
return "" エスケープ文字列.replace(/'/g, '\"') "'";
}

これはソース コードの関数と似ていますが、プロトタイプ ソース コードの実装はそうではありません。主な違いは、escapeString セクションにあります。すべての制御文字はソース コードに直接リストされ、[x00-x1f] として表現され、さらに '' は [x00-x1f\] となるため、上記の変更の初期バージョンは次のようになります:
コードをコピーします コードは次のとおりです:

function Inspection(useDoubleQuotes) {
varscapeString = this.replace(/[x00 -x1f\]/g , function(character) {
if (String.specialChar の文字) {
return String.specialChar[character];
return 文字
}) ;
if ( useDoubleQuotes) return '"'scapeString.replace(/"/g, '\"') '"';
return "'"scapeString.replace(/'/g, '\'' ) "'";
}
[html]
x00-x1f に対応する ASCII 制御文字エンコーディング テーブルを添付します:

String.specialChar 内の文字に加えて他の制御文字があることがわかった場合は、ソース コード内に制御文字を次の文字に変換するステップもあります。 Unicode 表現なので、このメソッド自体は文字列形式を取得するだけです。
たとえば、垂直タブ文字「v」です。 'v'.inspect() -->'u000b'
完全版:
[code]
function Inspection(useDoubleQuotes) {
varscapeString = this.replace(/[x00-x1f \]/g, function(character) {
if (String.specialChar の文字) {
return String.specialChar[character]
}
return '\u00'character.charCodeAt() .toPaddedString(2, 16);
});
if (useDoubleQuotes) returnsString(/"/g, '\"') '"'; scapeString.replace(/'/g, '\'') "'";
}


の場合、toPaddedString(length[, radix]) は現在の Number オブジェクトを文字列に変換します。変換された文字列の長さが length で指定された値より小さい場合、0 が左側の残りの桁の埋め込みに使用されます。オプションのパラメータ radix は、変換に使用される基数を指定するために使用されます。これは Prototype の Number の拡張です。とりあえず知っておいてください。
したがって、'v'.charCodeAt().toPaddedString(2, 16) は、'v' の文字エンコーディングを 16 進数 2 桁のエンコーディング文字に変換することになります (演算文字は範囲制限されないため、を超えません] 、最後に「u00」で始まります。

メソッドの説明:
toArray: 文字列を文字配列に分割します。
succ: Unicode アルファベットに従って文字列の最後の文字を後続の文字に変換します。
times: 文字列を繰り返します。
対応する具体的な実装も非常にシンプルで、String 部分の重要な部分は後続のスクリプト、JSON、置換処理にあり、その他は強化されています。


コードをコピー コードは次のとおりです:

function toArray() {
return this.split('');
}

ここで、split('') は文字列を個々の文字に分割して返します。さらに拡張したい場合は、toArray にパラメータを与えて区切り文字を指定できます。
コードをコピーします コードは次のとおりです。

function toArray(pattern) {
これを返します。 "xesam" ]


split を使用するだけですが、必要がないためソースコードでは行われていません。



function succ() {
return this.slice(0, this.length - 1) String.fromCharCode(this.charCodeAt(this.length - 1) 1);
}


ここでの主なものは次のとおりです。 fromCharCode メソッドと charCodeAt メソッドを使用します。また、このコードから、この 2 つの明らかな違いは、fromCharCode が String の静的メソッドであるのに対し、charCodeAt は String.prototype にぶら下がっている string のメソッドであることであることがわかります。次に、この 2 つはまったく逆の効果をもたらします。 http://www.w3school.com.cn による説明は次のとおりです。
fromCharCode() は、指定された Unicode 値を受け入れ、文字列を返します。
charCodeAt() メソッドは、指定された位置にある文字の Unicode エンコーディングを返します。この戻り値は 0 ~ 65535 の整数です。
succ に固有で、文字列 'hello xesam' を例にとると、最初に終了文字を除くすべての文字 'hello xesa' を取得し、次に Unicode テーブルの 'm' の後に文字 'n' を追加します。結果は「hello xesan」です。
これに基づいて、「a」から「z」までのすべての文字を印刷したい場合は、次の関数を使用できます:


function printChar(start,end){
var s = (start '').charCodeAt()
var e = (end '').charCodeAt();
if(s > e){
s = [e,e=s][0]
for(var i = s ;i console.log(String.fromCharCode(i))
}
}
printChar('a','z ');




コードをコピーします コードは次のとおりです: function times(count) {
return count < 1 ? '' : new Array(count 1).join(this);


回の関数は繰り返します。主なアイデアは、現在の文字を配列の連結子として呼び出して追加することであり、期待どおりの結果が得られます。もちろん、ループを使用して追加することもできますが、それほど単純ではありません。
文字列内の各文字を繰り返したい場合は、同じ考え方を使用できます:



コードをコピー
コードは次のとおりです。次のように: String.prototype.letterTimes = function(count){ var arr = [];
arr.length = count 1;
return this.replace( /w/g ,function(a){
return arr.join(a);
})
}
console.log('xesam'.letterTimes(3));//xxxeeesssaaammm



camelize | underscore | これらの 4 つは主に変数名の変換に関するものです。
camelize: ダッシュで区切られた文字列を Camel 形式に変換します。
capitalize: 文字列の最初の文字を大文字に変換し、他のすべての文字を小文字に変換します。
アンダースコア: Camel 形式の文字列をアンダースコア ("_") で区切られた一連の単語に変換します。
dasherize: 文字列内のすべてのアンダースコアをダッシュ​​に置き換えます (「_」は「-」に置き換えられます)。
最も明白なものは、CSS 属性と DOM スタイル属性の間の相互変換に使用できます (class と float はこのカテゴリに分類されません)。上記のメソッドに対応して、camelize メソッドを使用して CSS 属性を対応する DOM スタイル属性に変換できますが、その逆のメソッドはないため、underscore -> dumperize メソッドを連続して呼び出す必要があります。




コードをコピー
コードは次のとおりです。 function Camelize() { return this.replace (/- (.)?/g, function(match, chr) {
return chr ? chr.toUpperCase() : '';
}


中心となるのは replace メソッドの使用であり、残りは非常に単純です。「文字列における Replace メソッドの適用の簡単な分析」を参照してください。

コードをコピー コードは次のとおりです:

function Capitalize() {
return this.charAt(0).toUpperCase() this.substring (1).toLowerCase();
}

ここで、charAt (charAt() メソッドは指定された位置の文字を返すことができます) と charCodeAt の違いに注意してください。

コードをコピー コードは次のとおりです。

function underscore() {
return this.replace(/::/g, '/')
.replace(/([A-Z] )([A-Z][a-z])/g, '$1_$2')
。 replace(/ ([a-zd])([A-Z])/g, '$1_$2')
.replace(/-/g, '_')
.toLowerCase(); }

手順を示す例:

コードをコピーします コードは次のとおりです:
'helloWorld::ABCDefg'.underscore()
//'helloWorld::ABCDefg'
.replace(/::/g, '/') //'helloWorld/ ABCDefg'
.replace( /([A-Z] )([A-Z][a-z])/g, '$1_$2')//helloWorld/ABC_Defg
.replace(/([a-zd]) ([A-Z])/g, '$1_$2') //hello_World/ABC_Defg
.replace(/-/g, '_') //hello_World/ABC_Defg
.toLowerCase(); /abc_defg

このメソッドは Camel 形式にのみ適しています。つまり、「ピーク」が必要です。

コードをコピー コードは次のとおりです。
function dumperize() {
return this.replace (/_/g, '-');
}

これは単なる文字の置換です。
小西山子出身
関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート