当前位置: 首页 > 图文教程 > 网络编程 > Javascript > js函数般调用正则

Javascript
IE与firefox下Dhtml的一些区别小结
jQuery Selectors(选择器)的使用(一、基本篇)
jQuery Selectors(选择器)的使用(二、层次篇)
jQuery 跨域访问问题解决方法
jquery的ajax从纯真网(cz88.net)获取IP地址对应地区名
javascript 面向对象全新理练之数据的封装
javascript 面向对象全新理练之继承与多态
javascript 面向对象全新理练之原型继承
JavaScript 生成随机数并自动大小排序
JavaScript利用split函数按规定截取字符串(获取邮箱用户名)
JavaScript 双级下拉菜单实现代码
JavaScript split()使用方法与示例
33种Javascript 表格排序控件收集
js 屏蔽鼠标右键脚本附破解方法
javascript json 新手入门文档
jQuery Selectors(选择器)的使用(四-五、内容篇&可见性篇)
javascript KeyDown、KeyPress和KeyUp事件的区别与联系
javascript 汉字转拼音实现代码
javascript 跳转代码集合
JavaScript 申明函数的三种方法 每个函数就是一个对象(一)

Javascript 中的 js函数般调用正则


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-09-12   浏览: 291 ::
收藏到网摘: n/a

Firefox 包含了一个非标准的 JavaScript 扩展,使正则像函数一样可调用。

这为调用正则exec 方法提供了便捷。例如,在 Firefox中,regex(”string”) 等同于 regex.exec(”string”)。曾经 ECMAScript 4 建议指出这个功能将会增加到 ES4 规范中,但后来的在 ES4-discuss mailing list 的讨论中,这个建议可能被废除。

然而,你可以通过增加 callapply 方法到 RegExp.prototype 中类似的现实这些方法。既有助于功能设计,又可实现对函数和正则表达式均有效的隐藏类型(duck-typed )代码。因此,让我们增加这些方法。

复制代码 代码如下:

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

注意上面的两个方法完全忽略 context 参数,你可以提交 null 或者 任何其他作为 context 的对象,并且你将会类似的得到正则 exec 方法的返回值。使用上面的方法,无论在什么情况下,使我们正常地使用正则表达式和函数变得容易得多。一些很明显的例子,比如这些在 JavaScript 1.6 的数组迭代中很有用。下面的 filter, every, some, 和 map 方法的执行可以跨浏览器。

复制代码 代码如下:

var results = [];
for (var i = 0; i < this.length; i++) {
if (i in this && func.call(context, this[i], i, this))
results.push(this[i]);
}
return results;
};
}
if (!Array.prototype.every) {
// 返回 true ,如果数组中的每个元素满足提供的测试函数。
Array.prototype.every = function (func, context) {
for (var i = 0; i < this.length; i++) {
if (i in this && !func.call(context, this[i], i, this))
return false;
}
return true;
};
}
if (!Array.prototype.some) {
// 返回 true,如果数组中至少有一个元素满足提供的测试函数。
Array.prototype.some = function (func, context) {
for (var i = 0; i < this.length; i++) {
if (i in this && func.call(context, this[i], i, this))
return true;
}
return false;
};
}
if (!Array.prototype.map) {
// 返回一个数组,现有数组中的每个元素调用提供的函数的返回值。
Array.prototype.map = function (func, context) {
var results = [];
for (var i = 0; i < this.length; i++) {
if (i in this)
results[i] = func.call(context, this[i], i, this);
}
return results;
};
}

因为exec 方法返回数组或 null 值,并会恰当的类型转换为 true 和 false,上面的代码允许我们像这样使用:[”a”,”b”,”ab”,”ba”].filter(/^a/),返回所有以“a”开始的值:[”a”,”ab”]。
确实,在 Firefox 中已经实现了 Array.prototype.filter ,由于 exec 的间接调用已经在该浏览器中起作用了。但是如果 filter 没有添加 RegExp.prototype.call 方法,却无法跨浏览器执行。