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 相关文章推荐
jQuery Ajax提交表单查询获得数据实例代码
Sep 19 Javascript
JQuery-tableDnD 拖拽的基本使用介绍
Jul 04 Javascript
js中一个函数获取另一个函数返回值问题探讨
Nov 21 Javascript
jQuery实用技巧必备(上)
Nov 02 Javascript
json格式的javascript对象用法分析
Jul 04 Javascript
浅谈EasyUI常用控件的禁用方法
Nov 09 Javascript
JS实现一个简单的日历
Feb 22 Javascript
在vue中通过axios异步使用echarts的方法
Jan 13 Javascript
浅谈FastClick 填坑及源码解析
Mar 02 Javascript
js 数组详细操作方法及解析合集
Jun 01 Javascript
解决VantUI popup 弹窗不弹出或无蒙层的问题
Nov 03 Javascript
javascript实现京东快递单号的查询效果
Nov 30 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电台频率大全 - 5 内蒙古自治区
2020/03/11 无线电
如何从一个php文件向另一个地址post数据,不用表单和隐藏的变量的
2007/03/06 PHP
PHP中去除换行解决办法小结(PHP_EOL)
2011/11/27 PHP
PHP中读取文件的8种方法和代码实例
2014/08/05 PHP
PHP数组操作实例分析【添加,删除,计算,反转,排序,查找等】
2016/12/24 PHP
laravel 5.3 单用户登录简单实现方法
2019/10/14 PHP
将HTMLCollection/NodeList/伪数组转换成数组的实现方法
2011/06/20 Javascript
jquery应该如何来设置改变按钮input的onclick事件
2012/12/10 Javascript
js网页版计算器的简单实现
2013/07/02 Javascript
textarea焦点的用法实现获取焦点清空失去焦点提示效果
2014/05/19 Javascript
使用jquery实现放大镜效果
2014/09/02 Javascript
js电话号码验证方法
2015/09/28 Javascript
jQuery添加删除DOM元素方法详解
2016/01/18 Javascript
基于jQuery的网页影音播放器jPlayer的基本使用教程
2016/03/08 Javascript
VUE JS 使用组件实现双向绑定的示例代码
2017/01/10 Javascript
Vue中v-show添加表达式的问题(判断是否显示)
2018/03/26 Javascript
JS复杂判断的更优雅写法代码详解
2018/11/07 Javascript
Vue动态组件和异步组件原理详解
2019/05/06 Javascript
vue+openlayers绘制省市边界线
2020/12/24 Vue.js
[01:09:16]DOTA2-DPC中国联赛 正赛 SAG vs Dynasty BO3 第一场 1月25日
2021/03/11 DOTA
分析Python编程时利用wxPython来支持多线程的方法
2015/04/07 Python
以一个投票程序的实例来讲解Python的Django框架使用
2016/02/18 Python
python实现微信发送邮件关闭电脑功能
2018/02/22 Python
Python lambda表达式用法实例分析
2018/12/25 Python
python3实现微型的web服务器
2019/09/03 Python
Python descriptor(描述符)的实现
2020/11/15 Python
Bootstrap File Input文件上传组件
2020/12/01 HTML / CSS
美国手机支架公司:PopSockets
2019/11/27 全球购物
财务担保书范文
2014/04/02 职场文书
工地质量标语
2014/06/12 职场文书
运输企业安全生产责任书
2014/07/28 职场文书
户籍证明格式
2014/09/15 职场文书
毕业生就业推荐表导师评语
2014/12/31 职场文书
Pytorch可视化的几种实现方法
2021/06/10 Python
浅谈MySQL中的六种日志
2022/03/23 MySQL
Mysql分析设计表主键为何不用uuid
2022/03/31 MySQL