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 相关文章推荐
Javascript中的isNaN函数使用说明
Nov 10 Javascript
jquery datepicker参数介绍和示例
Apr 15 Javascript
jquery文本框中的事件应用以输入邮箱为例
May 06 Javascript
JS使用post提交的两种方式
Dec 03 Javascript
Javascript removeChild()删除节点及删除子节点的方法
Dec 27 Javascript
BootstrapValidator不触发校验的实现代码
Sep 28 Javascript
Bootstrap源码解读网格系统(3)
Dec 22 Javascript
老生常谈javascript的面向对象思想
Aug 22 Javascript
vue实现购物车功能(商品分类)
Apr 20 Javascript
React实现类似淘宝tab居中切换效果的示例代码
Jun 02 Javascript
JavaScript实现网页跨年倒计时
Dec 02 Javascript
测量JavaScript函数的性能各种方式对比
Apr 27 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
php addslashes和mysql_real_escape_string
2010/01/24 PHP
ThinkPHP分页实例
2014/10/15 PHP
Javascript 篱式条件判断
2008/08/22 Javascript
window.onload 加载完毕的问题及解决方案(上)
2009/07/09 Javascript
JS 精确统计网站访问量的实例代码
2013/07/05 Javascript
关于Jquery操作Cookie取值错误的解决方法
2013/08/26 Javascript
jsPDF生成pdf后在网页展示实例
2014/01/16 Javascript
Javascript连接多个数组不用concat来解决
2014/03/24 Javascript
jQuery中:focus选择器用法实例
2014/12/30 Javascript
JavaScript sort数组排序方法和自我实现排序方法小结
2016/06/06 Javascript
基于JavaScript实现焦点图轮播效果
2017/03/27 Javascript
JS实现评价的星星功能
2017/08/20 Javascript
js对象实例详解(JavaScript对象深度剖析,深度理解js对象)
2017/09/21 Javascript
JS实现websocket长轮询实时消息提示的效果
2017/10/10 Javascript
JS 中使用Promise 实现红绿灯实例代码(demo)
2017/10/20 Javascript
基于JavaScript中标识符的命名规则介绍
2018/01/06 Javascript
使用vue官方提供的模板vue-cli搭建一个helloWorld案例分析
2018/01/16 Javascript
详解es6超好用的语法糖Decorator
2018/08/01 Javascript
vue指令做滚动加载和监听等
2019/05/26 Javascript
electron 如何将任意资源打包的方法步骤
2020/04/16 Javascript
js实现浏览器打印功能的示例代码
2020/07/15 Javascript
Python编程中使用Pillow来处理图像的基础教程
2015/11/20 Python
Python3解释器知识点总结
2019/02/19 Python
Django中信号signals的简单使用方法
2019/07/04 Python
python 3.6.7实现端口扫描器
2019/09/04 Python
Python Opencv中用compareHist函数进行直方图比较对比图片
2020/04/07 Python
纯CSS3实现扇形动画菜单(简化版)实例源码
2017/01/17 HTML / CSS
Sneaker Studio波兰:购买运动鞋
2018/04/28 全球购物
上班玩手机检讨书
2014/02/17 职场文书
安全施工责任书
2014/08/25 职场文书
公务员年度考核个人总结
2015/02/12 职场文书
实习生个人总结范文
2015/02/28 职场文书
党支部意见范文
2015/06/02 职场文书
教你怎么用Python操作MySql数据库
2021/05/31 Python
聊聊Python中关于a=[[]]*3的反思
2021/06/02 Python
windows安装 redis 6.2.6最新步骤详解
2022/04/26 Redis