ホームページ >ウェブフロントエンド >jsチュートリアル >js のような正規表現の呼び出し function_javascript スキル

js のような正規表現の呼び出し function_javascript スキル

WBOY
WBOYオリジナル
2016-05-16 19:05:251070ブラウズ

これにより、通常の exec メソッドを呼び出すことが容易になります。たとえば、Firefox では、regex("string") は regex.exec("string") と同等です。この機能を ES4 仕様に追加するという ECMAScript 4 の提案がありましたが、後の ES4-discuss メーリング リスト の議論の中で、この提案は廃止された可能性があります。

ただし、call メソッドと apply メソッドを RegExp.prototype に追加することで、これらのメソッドを同様に実装できます。機能設計に役立つだけでなく、関数と正規表現の両方に有効なダックタイプ コードの実装も可能になります。そこで、これらのメソッドを追加しましょう。

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

RegExp.prototype.call = function (context) , str) {
return this.exec(str);
};
RegExp.prototype.apply = function (context, args) {
return this.exec(args[0]);
};

上記の 2 つのメソッドは context パラメーターを完全に無視することに注意してください。null またはその他のオブジェクトをコンテキストとして送信でき、同様に通常の exec メソッドの戻り値を取得できます。上記の方法を使用すると、どのような状況でも正規表現や関数を通常どおりに使用することが非常に簡単になります。これらのようないくつかの明白な例は、JavaScript 1.6 での配列の反復に役立ちます。次の フィルターすべて一部、および >map メソッドはブラウザ間で実行できます。

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

var results = [];
for (var i = 0; i if (i in this && func.call(context, this[i ], i, this))
results.push(this[i]);
return results.prototype.every) {
// 配列内の各要素が指定されたテスト関数を満たす場合は true を返します。
Array.prototype.every = function (func, context) {
for (var i = 0; i if (i in this && !func.call( context, this[i], i, this))
return false;
return true;
if (!Array.prototype.some) {
// true を返します。配列内の少なくとも 1 つの要素が提供されたテスト関数を満たすかどうか。
Array.prototype.some = function (func, context) {
for (var i = 0; i if (i in this && func.call(context) , this[i], i, this))
true を返す;
};

if (!Array.prototype.map ) {
// 配列を返します。既存の配列の各要素は、指定された関数の戻り値を呼び出します。
Array.prototype.map = function (func, context) {
var results = [];
for (var i = 0; i if ( i in this)
results[i] = func.call(context, this[i], i, this);
}
結果を返します。

exec メソッドは true と false への適切な型変換を使用して配列または null 値を返すため、上記のコードでは次のように使用できます: ["a","b","ab", "ba "].filter(/^a/)、"a" で始まるすべての値を返します: ["a","ab"]。

実際、Array.prototype.filter は Firefox に実装されています。これは、exec の間接呼び出しがこのブラウザですでに機能しているためです。ただし、フィルターに RegExp.prototype.call メソッドが追加されていない場合、ブラウザーをまたいで実行することはできません。

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