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 相关文章推荐
js中的string.format函数代码
Aug 11 Javascript
推荐10个超棒的jQuery工具提示插件
Oct 11 Javascript
javascript创建和存储cookie示例
Jan 07 Javascript
一个不错的js html页面倒计时可精确到秒
Oct 22 Javascript
javascript实现checkbox全选的代码
Apr 30 Javascript
使用AngularJS编写较为优美的JavaScript代码指南
Jun 19 Javascript
JS中的forEach、$.each、map方法推荐
Apr 05 Javascript
有关jquery与DOM节点操作方法和属性记录
Apr 15 Javascript
jQuery实现遍历复选框的方法示例
Mar 06 Javascript
SpringBoot+Vue前后端分离,使用SpringSecurity完美处理权限问题的解决方法
Jan 09 Javascript
详解如何使用webpack打包多页jquery项目
Feb 01 jQuery
Vue中对iframe实现keep alive无刷新的方法
Jul 23 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
全国FM电台频率大全 - 7 吉林省
2020/03/11 无线电
Linux下将excel数据导入到mssql数据库中的方法
2010/02/08 PHP
PHP的加密方式及原理
2012/06/14 PHP
PHP Ajax实现无刷新附件上传
2016/08/17 PHP
使一个函数作为另外一个函数的参数来运行的javascript代码
2007/08/13 Javascript
JavaScript Event学习第八章 事件的顺序
2010/02/07 Javascript
简洁短小的 JavaScript IE 浏览器判定代码
2010/03/21 Javascript
兼容ie、firefox的图片自动缩放的css跟js代码分享
2012/01/21 Javascript
自己实现string的substring方法 人民币小写转大写,数字反转,正则优化
2012/09/02 Javascript
jQuery中innerHeight()方法用法实例
2015/01/19 Javascript
jQuery实现菜单感应鼠标滑动动画效果的方法
2015/02/28 Javascript
javascript中slice(),splice(),split(),substring(),substr()使用方法
2015/03/13 Javascript
【经典源码收藏】基于jQuery的项目常见函数封装集合
2016/06/07 Javascript
JavaScript地理位置信息API
2016/06/11 Javascript
jQuery插件FusionCharts绘制ScrollColumn2D图效果示例【附demo源码下载】
2017/03/22 jQuery
基于daterangepicker日历插件使用参数注意的问题
2017/08/10 Javascript
vue中的计算属性的使用和vue实例的方法示例
2017/12/04 Javascript
浅谈JavaScript 代码简洁之道
2019/01/09 Javascript
JS数组属性去重并校验重复数据
2020/01/10 Javascript
[04:13]2018国际邀请赛典藏宝瓶Ⅱ饰品一览
2018/07/21 DOTA
[05:09]DOTA2-DPC中国联赛2月22日Recap集锦
2021/03/11 DOTA
Python编写百度贴吧的简单爬虫
2015/04/02 Python
python中模块的__all__属性详解
2017/10/26 Python
基于numpy.random.randn()与rand()的区别详解
2018/04/17 Python
Python使用sys.exc_info()方法获取异常信息
2020/07/23 Python
CSS3 icon font完全指南(CSS3 font 会取代icon图标)
2013/01/06 HTML / CSS
aden + anais英国官网:美国婴儿贴身用品品牌
2019/09/08 全球购物
软件测试常见笔试题
2012/02/04 面试题
毕业生医学检验求职信
2013/10/16 职场文书
建筑班组长岗位职责
2014/01/02 职场文书
党校学习自我鉴定
2014/02/24 职场文书
项目转让协议书
2014/10/27 职场文书
2014流动人口计划生育工作总结
2014/12/20 职场文书
2015年社区文体活动总结
2015/03/25 职场文书
主持人大赛开场白
2015/05/29 职场文书
2016党校培训心得体会
2016/01/07 职场文书