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 放大镜 移动镜片效果代码
May 09 Javascript
jQuery ajax serialize()方法的使用以及常见问题解决
Jan 27 Javascript
JS操作图片(增,删,改) 例子
Apr 17 Javascript
jQuery 的全选(全非选)即取得被选中的值使用介绍
Nov 12 Javascript
JS获取农历日期具体实例
Nov 14 Javascript
一个简单的jquery进度条示例
Apr 28 Javascript
js 弹出新页面避免被浏览器、ad拦截的一种新方法
Apr 30 Javascript
jQuery实现图片轮播效果代码
Sep 27 Javascript
Vue.JS入门教程之事件监听
Dec 01 Javascript
javascript深拷贝和浅拷贝详解
Feb 14 Javascript
jquery animate动画持续运动的实例
Nov 29 jQuery
HTML+JS实现“代码雨”效果源码(黑客帝国文字下落效果)
Mar 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中加密解密DES类的简单使用方法示例
2020/03/26 PHP
PHP实现计算器小功能
2020/08/28 PHP
找到一点可怜的关于dojo资料,谢谢作者!
2006/12/06 Javascript
javascript简单实现表格行间隔显示颜色并高亮显示
2013/11/29 Javascript
浅谈javascript实现八大排序
2015/04/27 Javascript
JavaScript代码生成PDF文件的方法
2016/02/26 Javascript
JS事件添加和移出的兼容写法示例
2016/06/20 Javascript
Bootstrap 网站实例之单页营销网站
2016/10/20 Javascript
vue.js指令v-model实现方法
2016/12/05 Javascript
微信小程序开发之圆形菜单 仿建行圆形菜单实例
2016/12/12 Javascript
原生JS京东轮播图代码
2017/03/22 Javascript
微信小程序 实例开发总结
2017/04/26 Javascript
详解如何用babel转换es6的class语法
2018/04/03 Javascript
Nodejs使用Mongodb存储与提供后端CRD服务详解
2018/09/04 NodeJs
Node.js Windows Binary二进制文件安装方法
2019/05/16 Javascript
js获取浏览器地址(获取第1个斜杠后的内容)
2019/09/03 Javascript
重置Redux的状态数据的方法实现
2019/11/18 Javascript
[49:30]DOTA2-DPC中国联赛正赛 Dragon vs Dynasty BO3 第二场 3月4日
2021/03/11 DOTA
Python中除法使用的注意事项
2014/08/21 Python
Python中使用MELIAE分析程序内存占用实例
2015/02/18 Python
Python自动化完成tb喵币任务的操作方法
2019/10/30 Python
Django实现分页显示效果
2019/10/31 Python
利用Python优雅的登录校园网
2020/10/21 Python
IE8下CSS3选择器nth-child() 不兼容问题的解决方法
2016/11/16 HTML / CSS
Brookstone美国官网:独特新奇产品
2017/03/04 全球购物
C++面试题目
2013/06/25 面试题
区域销售经理岗位职责
2013/12/10 职场文书
参观监狱心得体会
2014/01/02 职场文书
代理商会议邀请函
2014/01/27 职场文书
《藏戏》教学反思
2014/02/11 职场文书
大学生秋游活动方案
2014/02/17 职场文书
体育比赛口号
2014/06/09 职场文书
村主任“四风”问题个人对照检查材料思想汇报
2014/10/02 职场文书
党员反四风学习心得体会
2016/01/22 职场文书
Redisson实现Redis分布式锁的几种方式
2021/08/07 Redis
td 内容自动换行 table表格td设置宽度后文字太多自动换行
2022/12/24 HTML / CSS