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 相关文章推荐
JavaScript 事件参考手册
Dec 24 Javascript
将文本输入框内容加入表中的js代码
Aug 18 Javascript
JavaScript通过元素的ID和name设置样式
Jul 08 Javascript
JS实现仿Windows经典风格的选项卡Tab切换代码
Oct 20 Javascript
Angularjs material 实现搜索框功能
Mar 08 Javascript
js实现div模拟模态对话框展现URL内容
May 27 Javascript
全面解析多种Bootstrap图片轮播效果
May 27 Javascript
angularjs封装bootstrap时间插件datetimepicker
Jun 20 Javascript
vue-cli脚手架build目录下utils.js工具配置文件详解
Sep 14 Javascript
JS闭包原理与应用经典示例
Dec 20 Javascript
JS端基于download.js实现图片、视频时直接下载而不是打开预览
May 09 Javascript
vue v-for出来的列表,点击某个li使得当前被点击的li字体变红操作
Jul 17 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
php Ajax乱码
2008/04/09 PHP
PDO::quote讲解
2019/01/29 PHP
JavaScript 关键字屏蔽实现函数
2009/08/02 Javascript
javascript 上下banner替换具体实现
2013/11/14 Javascript
简单的邮箱登陆的提示效果类似于yahoo邮箱
2014/02/26 Javascript
js对象转json数组的简单实现案例
2014/02/28 Javascript
JS实现带鼠标效果的头像及文章列表代码
2015/09/27 Javascript
JS实现新浪微博效果带遮罩层的弹出框代码
2015/10/12 Javascript
jQuery实现下拉菜单(内容为时间)的实时更新及图表的随动更新的方法
2016/07/07 Javascript
基于Vue.js实现tab滑块效果
2017/07/23 Javascript
浅谈angular.copy() 深拷贝
2017/09/14 Javascript
详解Webstorm 下的Angular2.0开发之路(图文)
2018/12/06 Javascript
vue 组件中使用 transition 和 transition-group实现过渡动画
2019/07/09 Javascript
vue 翻页组件vue-flip-page效果
2020/02/05 Javascript
[48:21]林俊杰圣堂刺客超神杀戮秀
2014/10/29 DOTA
[01:01:41]DOTA2-DPC中国联赛 正赛 PSG.LGD vs Magma BO3 第二场 1月31日
2021/03/11 DOTA
python3监控CentOS磁盘空间脚本
2018/06/21 Python
对python csv模块配置分隔符和引用符详解
2018/12/12 Python
python调用虹软2.0第三版的具体使用
2019/02/22 Python
Python 点击指定位置验证码破解的实现代码
2019/09/11 Python
Python爬取YY评级分数并保存数据实现过程解析
2020/06/01 Python
Python分类测试代码实例汇总
2020/07/23 Python
Pycharm自动添加文件头注释和函数注释参数的方法
2020/10/23 Python
全球知名鞋履品牌授权零售商:Journeys
2016/09/17 全球购物
南威尔士家居商店:Leekes
2016/10/25 全球购物
土耳其时尚潮流在线购物网站:Trendyol
2017/10/10 全球购物
护理学毕业生自荐信
2013/10/02 职场文书
证券期货行业个人的自我评价
2013/12/26 职场文书
《四季》教学反思
2014/04/08 职场文书
农行心得体会
2014/09/02 职场文书
个人四风问题对照检查材料
2014/09/26 职场文书
2014年大学宣传部工作总结
2014/12/19 职场文书
市场督导岗位职责
2015/04/10 职场文书
上课迟到检讨书范文
2015/05/06 职场文书
2015年董事长秘书工作总结
2015/07/23 职场文书
logback 实现给变量指定默认值
2021/08/30 Java/Android