js下函数般调用正则的方法附代码


Posted in PHP onJune 22, 2008

曾经 ECMAScript 4 建议指出这个功能将会增加到 ES4 规范中,但后来的在 ES4-discuss mailing list 的讨论中,这个建议可能被废除。

然而,你可以通过增加 call 和 apply 方法到 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 方法的执行可以跨浏览器。

if (!Array.prototype.filter) {
    // 返回一个数组,如果提供的过滤函数返回 true,则返回存在的数组中的元素。
    Array.prototype.filter = function (func, context) {
        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 方法,却无法跨浏览器执行。

PHP 相关文章推荐
php UTF-8、Unicode和BOM问题
May 18 PHP
PHP面向对象学习笔记之二 生成对象的设计模式
Oct 06 PHP
php阻止页面后退的方法分享
Feb 17 PHP
异步加载技术实现当滚动条到最底部的瀑布流效果
Sep 16 PHP
php解析字符串里所有URL地址的方法
Apr 03 PHP
Yii中的cookie的发送和读取
Jul 27 PHP
PHP中overload与override的区别
Feb 13 PHP
PHP使用new StdClass()创建空对象的方法分析
Jun 06 PHP
PHP实现从上往下打印二叉树的方法
Jan 18 PHP
PHP+ajax实现二级联动菜单功能示例
Aug 10 PHP
php+redis实现消息队列功能示例
Sep 19 PHP
微信小程序结合ThinkPHP5授权登陆后获取手机号
Nov 23 PHP
php的正则处理函数总结分析
Jun 20 #PHP
PHP伪静态页面函数附使用方法
Jun 20 #PHP
PHP伪静态写法附代码
Jun 20 #PHP
用PHP伪造referer突破网盘禁止外连的代码
Jun 15 #PHP
php学习 字符串课件
Jun 15 #PHP
php学习 函数 课件
Jun 15 #PHP
PHP学习 运算符与运算符优先级
Jun 15 #PHP
You might like
星际中一些鲜为人知的详细资料
2020/03/04 星际争霸
php 自写函数代码 获取关键字 去超链接
2010/02/08 PHP
elgg 获取文件图标地址的方法
2010/03/20 PHP
php中10个不同等级压缩优化图片操作示例
2016/11/14 PHP
jquery Tab效果和动态加载的简单实例
2013/12/11 Javascript
JQUERY dialog的用法详细解析
2013/12/19 Javascript
浏览器窗口大小变化时使用resize事件对框架不起作用的解决方法
2014/05/11 Javascript
JQuery动画与特效实例分析
2015/02/02 Javascript
老生常谈 关于JavaScript的类的继承
2016/06/24 Javascript
JavaScript中闭包之浅析解读(必看篇)
2016/08/25 Javascript
JavaScript捕捉事件和阻止冒泡事件实例分析
2018/08/03 Javascript
vue展示dicom文件医疗系统的实现代码
2018/08/27 Javascript
Vue中插入HTML代码的方法
2018/09/21 Javascript
详解vue-router导航守卫
2019/01/19 Javascript
js实现图片上传到服务器和回显
2020/01/19 Javascript
JavaScript使用canvas绘制随机验证码
2020/02/17 Javascript
[46:09]2014 DOTA2华西杯精英邀请赛 5 25 LGD VS VG第三场
2014/05/26 DOTA
Python break语句详解
2014/03/11 Python
Zabbix实现微信报警功能
2016/10/09 Python
python实现机械分词之逆向最大匹配算法代码示例
2017/12/13 Python
python3+PyQt5实现自定义窗口部件Counters
2018/04/20 Python
在django-xadmin中APScheduler的启动初始化实例
2019/11/15 Python
python 追踪except信息方式
2020/04/25 Python
Python3.7在anaconda里面使用IDLE编译器的步骤详解
2020/04/29 Python
物流管理专业职业生涯规划书
2014/01/06 职场文书
运动会开幕式邀请函
2014/02/03 职场文书
毕业自我评价
2014/02/05 职场文书
公开服务承诺制度
2014/03/26 职场文书
宣传普通话标语
2014/06/27 职场文书
开展批评与自我批评发言材料
2014/10/17 职场文书
优秀共青团员事迹材料
2014/12/25 职场文书
金秋助学感谢信
2015/01/21 职场文书
2015年大学班主任工作总结
2015/04/30 职场文书
代理词怎么写
2015/05/25 职场文书
在职证明书模板
2015/06/15 职场文书
Go语言中的UTF-8实现
2021/04/26 Golang