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 数组排序函数
Aug 20 Javascript
autoIMG 基于jquery的图片自适应插件代码
Mar 12 Javascript
JS实现仿Windows经典风格的选项卡Tab切换代码
Oct 20 Javascript
js 性能优化之快速响应的用户界面
Feb 15 Javascript
微信小程序商城项目之淘宝分类入口(2)
Apr 17 Javascript
JS失效 提示HTML1114: (UNICODE 字节顺序标记)的代码页 utf-8 覆盖(META 标记)的冲突的代码页 utf-8
Jun 23 Javascript
js限制输入框只能输入数字(onkeyup触发)
Sep 28 Javascript
JS module的导出和导入的实现代码
Feb 25 Javascript
vue动态注册组件实例代码详解
May 30 Javascript
jQuery 常用特效实例小结【显示与隐藏、淡入淡出、滑动、动画等】
May 19 jQuery
vue项目在线上服务器访问失败原因分析
Aug 14 Javascript
vue+node 实现视频在线播放的实例代码
Oct 19 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页面防重复提交方法总结
2013/11/25 PHP
Eclipse的PHP插件PHPEclipse安装和使用
2014/07/20 PHP
php通过strpos查找字符串出现位置的方法
2015/03/17 PHP
PHP时间和日期函数详解
2015/05/08 PHP
PHP针对字符串开头和结尾的判断方法
2016/07/11 PHP
PHP5.5基于mysqli连接MySQL数据库和读取数据操作实例详解
2019/02/16 PHP
Add a Picture to a Microsoft Word Document
2007/06/15 Javascript
事件模型在各浏览器中存在差异
2010/10/20 Javascript
Javascript解析URL方法详解
2014/12/05 Javascript
JS实现图片产生波纹一样flash效果的方法
2015/02/27 Javascript
JS中的eval 为什么加括号
2016/04/13 Javascript
如何提高Dom访问速度
2017/01/05 Javascript
详解React开发中使用require.ensure()按需加载ES6组件
2017/05/12 Javascript
深入理解Commonjs规范及Node模块实现
2017/05/17 Javascript
JS FormData上传文件的设置方法
2017/07/05 Javascript
React Native实现进度条弹框的示例代码
2017/07/17 Javascript
hammer.js实现图片手势放大效果
2017/08/29 Javascript
深入浅析JavaScript中的RegExp对象
2017/09/18 Javascript
JavaScript模块模式实例详解
2017/10/25 Javascript
利用jsonp解决js读取本地json跨域的问题
2018/12/11 Javascript
微信小程序云函数使用mysql数据库过程详解
2019/08/07 Javascript
[02:42]DOTA2城市挑战赛收官在即 四强之争风起云涌
2018/06/05 DOTA
Python温度转换实例分析
2018/01/17 Python
Python3.5内置模块之time与datetime模块用法实例分析
2019/04/27 Python
Python socket实现的文件下载器功能示例
2019/11/15 Python
10个Python面试常问的问题(小结)
2019/11/20 Python
使用pyinstaller逆向.pyc文件
2019/12/20 Python
python画图常规设置方式
2020/03/05 Python
Pycharm plot独立窗口显示的操作
2020/12/11 Python
石油工程专业毕业生求职信
2014/04/13 职场文书
2015年学校总务处工作总结
2015/05/19 职场文书
详解Python牛顿插值法
2021/05/11 Python
python实现简单的井字棋
2021/05/26 Python
JavaWeb 入门篇:创建Web项目,Idea配置tomcat
2021/07/16 Java/Android
Python实现打乒乓小游戏
2021/09/25 Python
Python循环之while无限迭代
2022/04/30 Python