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实现控制内容的向上向下滚动效果
Jun 26 Javascript
用showModalDialog弹出页面后,提交表单总是弹出一个新窗口
Jul 18 Javascript
JS+XML 省份和城市之间的联动实现代码
Oct 14 Javascript
用jquery等比例控制图片宽高的具体实现
Jan 28 Javascript
JS获取几种URL地址的方法小结
Feb 26 Javascript
node.js WEB开发中图片验证码的实现方法
Jun 03 Javascript
JS+DIV+CSS排版布局实现美观的选项卡效果
Oct 10 Javascript
判断JS对象是否拥有某属性的方法推荐
May 12 Javascript
javascript用正则表达式过滤空格的实现代码
Jun 14 Javascript
VUE预渲染及遇到的坑
Sep 03 Javascript
Vuejs中的watch实例详解(监听者)
Jan 05 Javascript
使用JS实现动态时钟
Mar 12 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
使用dump函数,给php加断点测试
2013/06/25 PHP
php实现监听事件
2013/11/06 PHP
yii通过小物件生成view的方法
2016/10/08 PHP
php抛出异常与捕捉特定类型的异常详解
2016/10/26 PHP
PHP针对redis常用操作实例详解
2019/08/17 PHP
一段利用WSH修改和查看IP配置的代码
2008/05/11 Javascript
javascript attachEvent和addEventListener使用方法
2009/03/19 Javascript
Javascript attachEvent传递参数的办法
2009/12/14 Javascript
jQuery父级以及同级元素查找介绍
2013/09/04 Javascript
JavaScript判断变量是否为undefined的两种写法区别
2013/12/04 Javascript
扩展IE中一些不兼容的方法如contains、startWith等等
2014/01/09 Javascript
jQuery中prop()方法用法实例
2015/01/05 Javascript
JS加载器如何动态加载外部js文件
2016/05/26 Javascript
JQuery获取鼠标进入和离开容器的方向
2016/12/29 Javascript
Angular下H5上传图片的方法(可多张上传)
2017/01/09 Javascript
vue双向数据绑定原理探究(附demo)
2017/01/17 Javascript
bootstrap daterangepicker双日历时间段选择控件详解
2017/06/15 Javascript
浅谈微信JS-SDK 微信分享接口开发(介绍版)
2018/08/15 Javascript
手淘flexible.js框架使用和源代码讲解小结
2018/10/15 Javascript
JS 获取文件后缀,判断文件类型(比如是否为图片格式)
2020/05/09 Javascript
Python实现简单HTML表格解析的方法
2015/06/15 Python
Python多层装饰器用法实例分析
2018/02/09 Python
Python cookbook(数据结构与算法)实现查找两个字典相同点的方法
2018/02/18 Python
教你使用python实现微信每天给女朋友说晚安
2018/03/23 Python
Python定时任务随机时间执行的实现方法
2019/08/14 Python
使用Python防止SQL注入攻击的实现示例
2020/05/21 Python
Django跨域请求原理及实现代码
2020/11/14 Python
StubHub墨西哥:购买和出售您的门票
2016/09/17 全球购物
欧洲最大的美妆零售网站:Feelunique
2017/01/14 全球购物
100%有机精油,美容油:House of Pure Essence
2018/10/30 全球购物
中考标语大全
2014/06/05 职场文书
大三学生学年自我鉴定
2014/09/12 职场文书
搞笑结婚保证书
2015/05/08 职场文书
贫困生证明范文
2015/06/16 职场文书
公司管理制度范本
2015/08/03 职场文书
2016大学生求职自荐信范文
2016/01/28 职场文书