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 相关文章推荐
Linux下ZendOptimizer的安装与配置方法
Apr 12 PHP
使用PHPMYADMIN操作mysql数据库添加新用户和数据库的方法
Apr 02 PHP
ThinkPHP 防止表单重复提交的方法
Aug 08 PHP
PHP操作Memcache实例介绍
Jun 14 PHP
php的数组与字符串的转换函数整理汇总
Jul 18 PHP
php curl基本操作详解
Jul 23 PHP
php中error与exception的区别及应用
Jul 28 PHP
PHP实现加密的几种方式介绍
Feb 22 PHP
PHP表单提交后引号前自动加反斜杠的原因及三种办法关闭php魔术引号
Sep 30 PHP
PHP中获取文件创建日期、修改日期、访问时间的方法
Nov 05 PHP
php cookie用户登录的详解及实例代码
Jan 03 PHP
laravel 5.1下php artisan migrate的使用注意事项总结
Jun 07 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
Discuz! 5.0.0论坛程序中加入一段js代码,让会员点击下载附件前自动弹出提示窗口
2007/04/18 PHP
PHP字符串中特殊符号的过滤方法介绍
2014/02/18 PHP
php通过各种函数判断0和空
2020/07/04 PHP
用Javscript实现表单复选框的全选功能
2007/05/25 Javascript
JQuery对id中含有特殊字符的转义处理示例
2013/09/06 Javascript
常见表单重复提交问题整理及解决方法
2013/11/13 Javascript
javascript中直接引用Microsoft的COM生成Word
2014/01/20 Javascript
javascript 获取函数形参个数
2014/07/31 Javascript
jQuery事件绑定与解除绑定实现方法
2015/04/15 Javascript
JavaScript实现彩虹文字效果的方法
2015/04/16 Javascript
js判断当前页面在移动设备还是在PC端中打开
2016/01/06 Javascript
浅析JavaScript中的变量复制、参数传递和作用域链
2016/01/13 Javascript
浅谈vue-lazyload实现的详细过程
2017/08/22 Javascript
vue-cli的build的文件夹下没有dev-server.js文件配置mock数据的方法
2019/04/17 Javascript
世界上最短的数字判断js代码
2019/09/09 Javascript
javascript利用键盘控制小方块的移动
2020/04/20 Javascript
win7上python2.7连接mysql数据库的方法
2017/01/14 Python
Python操作Sql Server 2008数据库的方法详解
2018/05/17 Python
Python实现的朴素贝叶斯算法经典示例【测试可用】
2018/06/13 Python
python3中利用filter函数输出小于某个数的所有回文数实例
2019/11/24 Python
如何使用python传入不确定个数参数
2020/02/18 Python
灵活运用CSS3特性绘制简易版围棋效果
2016/09/28 HTML / CSS
美国最受欢迎的度假租赁网站:VRBO
2016/08/02 全球购物
传统软件工程与面向对象的软件工程有什么区别
2012/05/31 面试题
庆中秋节主题活动方案
2014/02/03 职场文书
会计自我鉴定
2014/02/04 职场文书
党员干部三严三实心得体会
2014/10/13 职场文书
2014年办公室工作总结范文
2014/11/12 职场文书
清洁工个人总结
2015/03/04 职场文书
文明旅游倡议书
2015/04/28 职场文书
战马观后感
2015/06/08 职场文书
2015年圣诞节寄语
2015/08/17 职场文书
初中信息技术教学反思
2016/02/16 职场文书
初一数学教学反思
2016/02/17 职场文书
Java后端 Dubbo retries 超时重试机制的解决方案
2022/04/14 Java/Android
Ruby GDBM操作简介及数据存储原理
2022/04/19 Ruby