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.ini 中文版
Oct 28 PHP
PHP自动生成后台导航网址的最佳方法
Aug 27 PHP
基于php和mysql的简单的dao类实现crud操作功能
Jan 27 PHP
WordPress开发中的get_post_custom()函数使用解析
Jan 04 PHP
基于php(Thinkphp)+jquery 实现ajax多选反选不选删除数据功能
Feb 24 PHP
[原创]php正则删除html代码中class样式属性的方法
May 24 PHP
Yii框架日志记录Logging操作示例
Jul 12 PHP
实现php删除链表中重复的结点
Sep 27 PHP
php 调用百度sms来发送短信的实现示例
Nov 02 PHP
PHP实现的支付宝支付功能示例
Mar 26 PHP
PHP中Static(静态)关键字功能与用法实例分析
Apr 05 PHP
PHP FileSystem 文件系统常用api整理总结
Jul 12 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 开源框架22个简单简介
2009/08/24 PHP
解析如何在PHP下载文件名中解决乱码的问题
2013/06/20 PHP
php常用表单验证类用法实例
2015/06/18 PHP
简单实现php上传文件功能
2017/09/21 PHP
php实现文章评论系统
2019/02/18 PHP
PHP7 新增功能
2021/03/09 PHP
关于 文本框默认值 的操作js代码
2012/01/12 Javascript
Javascript中实现String.startsWith和endsWith方法
2015/06/10 Javascript
JavaScript简单判断复选框是否选中及取出值的方法
2015/08/13 Javascript
jQuery实现点击查看大图并以弹框的形式居中
2016/08/08 Javascript
jquery插件uploadify多图上传功能实现代码
2016/08/12 Javascript
JavaScript实现简易的天数计算器实例【附demo源码下载】
2017/01/18 Javascript
常用的几个JQuery代码片段
2017/03/13 Javascript
js模拟支付宝密码输入框
2017/04/11 Javascript
jquery实现左右轮播切换效果
2018/01/01 jQuery
angularjs 页面自适应高度的方法
2018/01/17 Javascript
微信小程序如何获取openid及用户信息
2018/01/26 Javascript
vue.js响应式原理解析与实现
2020/06/22 Javascript
Vue实现开心消消乐游戏算法
2019/10/22 Javascript
编写Python爬虫抓取豆瓣电影TOP100及用户头像的方法
2016/01/20 Python
Python3使用requests包抓取并保存网页源码的方法
2016/03/15 Python
Python处理PDF及生成多层PDF实例代码
2017/04/24 Python
Python面向对象类的继承实例详解
2018/06/27 Python
Keras自定义实现带masking的meanpooling层方式
2020/06/16 Python
Python 3.10 的首个 PEP 诞生,内置类型 zip() 迎来新特性(推荐)
2020/07/03 Python
pycharm使用技巧之自动调整代码格式总结
2020/11/04 Python
打印机墨盒:123Inkjets
2017/02/16 全球购物
标签和贴纸印刷:Lightning Labels
2018/03/22 全球购物
纪念九一八事变演讲稿:忘记意味着背叛
2014/09/14 职场文书
四风问题自我剖析材料
2014/10/07 职场文书
党的群众路线教育实践活动批评与自我批评范文
2014/10/16 职场文书
幼儿园教研工作总结2015
2015/05/12 职场文书
上诉状格式
2015/05/23 职场文书
mysql在项目中怎么选事务隔离级别
2021/05/25 MySQL
Redis 常见使用场景
2021/08/30 Redis
python的html标准库
2022/04/29 Python