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实例教程(19) 使用HoTMetal(1)
Dec 23 Javascript
JQuery 选项卡效果(JS与HTML的分离)
Apr 01 Javascript
js function使用心得
May 10 Javascript
javascript中最常用的继承模式 组合继承
Aug 12 Javascript
Javascript中定义方法的另类写法(批量定义js对象的方法)
Feb 25 Javascript
js创建一个input数组并绑定click事件的方法
Jun 12 Javascript
js前端实现多图图片上传预览的两个方法(推荐)
Nov 18 Javascript
Vue2.x中的Render函数详解
May 30 Javascript
详解Node.js模板引擎Jade入门
Jan 19 Javascript
详解Axios统一错误处理与后置
Sep 26 Javascript
vue基础之模板和过滤器用法实例分析
Mar 12 Javascript
Vue中常用rules校验规则(实例代码)
Nov 14 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程序的方法小结
2012/02/23 PHP
php实现xml与json之间的相互转换功能实例
2016/07/07 PHP
Laravel中的chunk组块结果集处理与注意问题
2018/08/15 PHP
PHP PDOStatement::bindParam讲解
2019/01/30 PHP
jquery不会自动回收xmlHttpRequest对象 导致了内存溢出
2012/06/18 Javascript
简介JavaScript中的setTime()方法的使用
2015/06/11 Javascript
JS获取和修改元素样式的实例代码
2016/08/06 Javascript
使用React实现轮播效果组件示例代码
2016/09/05 Javascript
jquery中ajax请求后台数据成功后既不执行success也不执行error的完美解决方法
2017/12/24 jQuery
在小程序/mpvue中使用flyio发起网络请求的方法
2018/09/13 Javascript
vue单页缓存存在的问题及解决方案(小结)
2018/09/25 Javascript
vue-lazyload使用总结(推荐)
2018/11/01 Javascript
node全局变量__dirname与__filename的区别
2019/01/14 Javascript
JavaScript显式数据类型转换详解
2019/03/18 Javascript
python基础教程之popen函数操作其它程序的输入和输出示例
2014/02/10 Python
python数据结构之链表的实例讲解
2017/07/25 Python
Python实现的生产者、消费者问题完整实例
2018/05/30 Python
python正则表达式之对号入座篇
2018/07/24 Python
Python 实现两个服务器之间文件的上传方法
2019/02/13 Python
linux环境下Django的安装配置详解
2019/07/22 Python
通过python扫描二维码/条形码并打印数据
2019/11/14 Python
Python中logging日志记录到文件及自动分割的操作代码
2020/08/05 Python
在pycharm中文件取消用 pytest模式打开的操作
2020/09/01 Python
Python利用Pillow(PIL)库实现验证码图片的全过程
2020/10/04 Python
Window10上Tensorflow的安装(CPU和GPU版本)
2020/12/15 Python
linux系统都有哪些运行级别
2012/04/15 面试题
个人简历中的自我评价范例
2013/10/29 职场文书
公司庆典主持词
2015/07/04 职场文书
庆元旦主持词
2015/07/06 职场文书
2015年中秋寄语
2015/07/31 职场文书
初一军训感言
2015/08/01 职场文书
幼儿园大班教师随笔
2015/08/14 职场文书
七年级作文(600字3篇)
2019/09/24 职场文书
opencv用VS2013调试时用Image Watch插件查看图片
2021/07/26 Python
Python列表的索引与切片
2022/04/07 Python
从原生JavaScript到React深入理解
2022/07/23 Javascript