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解决iframe高度自适应代码
Dec 20 Javascript
纯CSS打造的导航菜单(附jquery版)
Aug 07 Javascript
为你的网站增加亮点的9款jQuery插件推荐
May 03 Javascript
Jquery对象和Dom对象的区别分析
Nov 20 Javascript
easyui tree带checkbox实现单选的简单实例
Nov 07 Javascript
Bootstrap table使用方法记录
Aug 23 Javascript
原生js实现简单的模态框示例
Sep 08 Javascript
Angularjs 1.3 中的$parse实例代码
Sep 14 Javascript
使用vue-cli脚手架工具搭建vue-webpack项目
Jan 14 Javascript
Layui 带多选框表格监听事件以及按钮自动点击写法实例
Sep 02 Javascript
Vue中关闭弹窗组件时销毁并隐藏操作
Sep 01 Javascript
基于JavaScript实现简单的轮播图
Mar 03 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
elgg 获取文件图标地址的方法
2010/03/20 PHP
php中file_exists函数使用详解
2015/05/08 PHP
实例讲解php数据访问
2016/05/09 PHP
Thinkphp5+uploadify实现的文件上传功能示例
2018/05/26 PHP
关于flash遮盖div浮动层的解决方法
2010/07/17 Javascript
70+漂亮且极具亲和力的导航菜单设计国外网站推荐
2011/09/20 Javascript
基于jQuery的遍历同id元素 并响应事件的代码
2012/06/14 Javascript
js中小数转换整数的方法
2014/01/26 Javascript
取得元素的左和上偏移量的方法
2014/09/17 Javascript
深入理解JavaScript系列(31):设计模式之代理模式详解
2015/03/03 Javascript
vue中用动态组件实现选项卡切换效果
2017/03/25 Javascript
React之PureComponent的使用作用
2018/07/10 Javascript
vue实现分页组件
2020/06/16 Javascript
原生JS实现贪吃蛇小游戏
2020/03/09 Javascript
[58:32]EG vs Liquid 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/19 DOTA
Python中的作用域规则详解
2015/01/30 Python
Python+Selenium自动化实现分页(pagination)处理
2017/03/31 Python
python leetcode 字符串相乘实例详解
2018/09/03 Python
使用 Visual Studio Code(VSCode)搭建简单的Python+Django开发环境的方法步骤
2018/12/17 Python
Python 判断奇数偶数的方法
2018/12/20 Python
萨克斯第五大道英国:Saks Fifth Avenue英国
2019/04/01 全球购物
C# .NET面试题
2015/11/28 面试题
服务中心夜班服务员岗位职责
2013/11/27 职场文书
优秀公益广告词大全
2014/03/19 职场文书
三项教育活动实施方案
2014/03/30 职场文书
2014年银行个人工作总结
2014/12/05 职场文书
收银员岗位职责范本
2015/04/07 职场文书
2015年销售员工作总结范文
2015/04/07 职场文书
小学教师师德师风承诺书
2015/04/28 职场文书
观看建国大业观后感
2015/06/01 职场文书
立案决定书范文
2015/06/24 职场文书
运动会广播稿50字
2015/08/19 职场文书
2016年优秀少先队员事迹材料
2016/02/26 职场文书
php字符串倒叙
2021/04/01 PHP
英镑符号 £
2022/02/17 杂记
关于k8s环境部署mysql主从的问题
2022/03/13 MySQL