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 str_replace的替换漏洞
Mar 15 PHP
对squid中refresh_pattern的一些理解和建议
Apr 17 PHP
PHP中文URL编解码(urlencode()rawurlencode()
Jul 03 PHP
php入门学习知识点三 PHP上传
Jul 14 PHP
php获取操作系统语言代码
Nov 04 PHP
PHP中数据类型转换的三种方式
Apr 02 PHP
php实现微信公众号无限群发
Oct 11 PHP
SAE实时日志接口SDK用法示例
Oct 09 PHP
PHP封装返回Ajax字符串和JSON数组的方法
Feb 17 PHP
详细解读php的命名空间(一)
Feb 21 PHP
PHP工厂模式简单实现方法示例
May 23 PHP
thinkPHP5框架分页样式类完整示例
Sep 01 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
php实现删除指定目录下相关文件的方法
2014/10/20 PHP
Json_encode防止汉字转义成unicode的方法
2016/02/25 PHP
解析PHP的Yii框架中cookie和session功能的相关操作
2016/03/17 PHP
PHP环境搭建(php+Apache+mysql)
2016/11/14 PHP
ArrayList类(增强版)
2007/04/04 Javascript
Mozilla 表达式 __noSuchMethod__
2009/04/05 Javascript
使用JS读秒使用示例
2013/09/21 Javascript
JQuery中节点遍历方法实例
2015/05/18 Javascript
如何屏蔽防止别的网站嵌入框架代码
2015/08/24 Javascript
基于jQuery实现Div窗口震动特效代码-代码简单
2015/08/28 Javascript
Javascript设计模式之观察者模式(推荐)
2016/03/29 Javascript
手机端点击图片放大特效PhotoSwipe.js插件实现
2016/08/24 Javascript
Vue.js 父子组件通讯开发实例
2016/09/06 Javascript
详解Angular的内置过滤器和自定义过滤器【推荐】
2016/12/26 Javascript
原生和jQuery的ajax用法详解
2017/01/23 Javascript
vue脚手架vue-cli的学习使用教程
2017/06/06 Javascript
vue地区选择组件教程详解
2018/05/04 Javascript
vue中利用Promise封装jsonp并调取数据
2019/06/18 Javascript
[06:30]DOTA2英雄梦之声_第15期_死亡先知
2014/06/21 DOTA
python3.4实现邮件发送功能
2018/05/28 Python
python通过微信发送邮件实现电脑关机
2018/06/20 Python
Win8下python3.5.1安装教程
2020/07/29 Python
pycharm+PyQt5+python最新开发环境配置(踩坑)
2019/02/11 Python
六行python代码的爱心曲线详解
2019/05/17 Python
解决pyqt5中QToolButton无法使用的问题
2019/06/21 Python
解决Python对齐文本字符串问题
2019/08/28 Python
Python logging模块写入中文出现乱码
2020/05/21 Python
美体小铺印度官网:The Body Shop印度
2019/10/17 全球购物
迪士尼西班牙官方网上商店:ShopDisney西班牙
2020/02/02 全球购物
Ibatis的核心配置文件都有什么
2014/09/08 面试题
档案检查欢迎词
2014/01/13 职场文书
文化宣传方案
2014/03/13 职场文书
副处级干部考察材料
2014/05/17 职场文书
酒店厨房管理制度
2015/08/06 职场文书
解决IDEA翻译插件Translation报错更新TTK失败不能使用
2022/04/24 Python
CSS使用SVG实现动态分布的圆环发散路径动画
2022/12/24 HTML / CSS