js函数般调用正则


Posted in Javascript onApril 08, 2008

这为调用正则的 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 方法,却无法跨浏览器执行。

Javascript 相关文章推荐
分享一个自定义的console类 让你不再纠结JS中的调试代码的兼容
Apr 20 Javascript
jQuery中$.get、$.post、$.getJSON和$.ajax的用法详解
Nov 19 Javascript
js控制网页背景音乐播放与停止的方法
Feb 06 Javascript
RequireJS入门一之实现第一个例子
Sep 30 Javascript
Jquery+Ajax+PHP+MySQL实现分类列表管理(上)
Oct 28 Javascript
基于Jquery代码实现手风琴菜单
Nov 19 Javascript
关于Stream和Buffer的相互转换详解
Jul 26 Javascript
Node.JS更改Windows注册表Regedit的方法小结
Aug 18 Javascript
javaScript实现鼠标在文字上悬浮时弹出悬浮层效果
Apr 12 Javascript
如何编写一个d.ts文件的步骤详解
Apr 13 Javascript
vue-mugen-scroll组件实现pc端滚动刷新
Aug 16 Javascript
Vue-cli3多页面配置详解
Mar 22 Javascript
javascript背投广告代码的完善
Apr 08 #Javascript
大家未必知道的Js技巧收藏
Apr 07 #Javascript
用JavaScript调用WebService的示例
Apr 07 #Javascript
HTML中Select不用Disabled实现ReadOnly的效果
Apr 07 #Javascript
javascript add event remove event
Apr 07 #Javascript
JS动画效果代码3
Apr 03 #Javascript
CSS常用网站布局实例
Apr 03 #Javascript
You might like
ecshop 订单确认中显示省市地址信息的方法
2010/03/15 PHP
解析PHP中$_FILES的使用以及注意事项
2013/07/05 PHP
php中怎么搜索相关联数组键值及获取之
2013/10/17 PHP
PHP导入导出Excel代码
2015/07/07 PHP
php 升级到 5.3+ 后出现的一些错误,如 ereg(); ereg_replace(); 函数报错
2015/12/07 PHP
PHP实现的Redis多库选择功能单例类
2017/07/27 PHP
yii2.0整合阿里云oss删除单个文件的方法
2017/09/19 PHP
win10 apache配置虚拟主机后localhost无法使用的解决方法
2018/01/27 PHP
php分享朋友圈的实现代码
2019/02/18 PHP
使用ImageMagick进行图片缩放、合成与裁剪(js+python)
2013/09/16 Javascript
jQuery判断checkbox(复选框)是否被选中以及全选、反选实现代码
2014/02/21 Javascript
谷歌浏览器调试JavaScript小技巧
2014/12/29 Javascript
Ajax中解析Json的两种方法对比分析
2015/06/25 Javascript
JavaScript实现微信号随机切换代码
2018/03/09 Javascript
原生JS实现图片懒加载之页面性能优化
2019/04/26 Javascript
js设计模式之单例模式原理与用法详解
2019/08/15 Javascript
jquery css实现流程进度条
2020/03/26 jQuery
Vue移动端用淘宝弹性布局lib-flexible插件做适配的方法
2020/05/26 Javascript
JS如何实现封装列表右滑动删除收藏按钮
2020/07/23 Javascript
Python进程通信之匿名管道实例讲解
2015/04/11 Python
Python实现求笛卡尔乘积的方法
2017/09/16 Python
Python3内置模块random随机方法小结
2019/07/13 Python
序列化Python对象的方法
2020/08/01 Python
pycharm远程连接服务器并配置python interpreter的方法
2020/12/23 Python
渗透攻击的测试步骤
2014/06/07 面试题
护理专业毕业生推荐信
2013/10/31 职场文书
长安大学毕业生自我鉴定
2014/01/17 职场文书
内蒙古鄂尔多斯市市长寄语
2014/04/10 职场文书
企业管理标语
2014/06/10 职场文书
领导干部群众路线个人对照检查材料思想汇报
2014/09/30 职场文书
2014年教育实习工作总结
2014/11/22 职场文书
毕业设计致谢词
2015/05/14 职场文书
导游词之杭州西湖
2019/09/19 职场文书
详解Python 3.10 中的新功能和变化
2021/04/28 Python
python3.9之你应该知道的新特性详解
2021/04/29 Python
【DOTA2】半决赛强强对话~ PSG LGD vs EHOME - DPC 2022 CN REGIONAL FINALS WINTER
2022/04/02 DOTA