JavaScript扩展:正则像函数一样调用

窝边草star

窝边草star

2016-02-20 00:45

今天图老师小编给大家展示的是JavaScript扩展:正则像函数一样调用,精心挑选的内容希望大家多多支持、多多分享,喜欢就赶紧get哦!

(本文来源于图老师网站,更多请访问https://m.tulaoshi.com/webkaifa/)

原文地址:《Regular Expressions As Functions》

(本文来源于图老师网站,更多请访问https://m.tulaoshi.com/webkaifa/)

Firefox 包含了一个非标准的 JavaScript 扩展,使正则像函数一样可调用。这为调用正则的 exec 方法提供了便捷。例如,在 Firefox中,regex(string) 等同于 regex.exec(string)。曾经 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 方法,却无法跨浏览器执行。

展开更多 50%)
分享

猜你喜欢

JavaScript扩展:正则像函数一样调用

Web开发
JavaScript扩展:正则像函数一样调用

像“动物”一样练瑜伽

瑜伽 养生 健康
像“动物”一样练瑜伽

s8lol主宰符文怎么配

英雄联盟 网络游戏
s8lol主宰符文怎么配

幸福像花儿一样怎样做 最正宗幸福像花儿一样的做法

牛里脊 芦笋
幸福像花儿一样怎样做 最正宗幸福像花儿一样的做法

像孩子一样跟孩子玩

亲子 育儿知识 怀孕 孕妇
像孩子一样跟孩子玩

lol偷钱流符文搭配推荐

英雄联盟 网络游戏
lol偷钱流符文搭配推荐

怎样做幸福像花儿一样

牛里脊 芦笋
怎样做幸福像花儿一样

过上像杂志一样的生活

孕前
过上像杂志一样的生活

lolAD刺客新符文搭配推荐

英雄联盟
lolAD刺客新符文搭配推荐

AJAX中文乱码的两类问题

AJAX中文乱码的两类问题

深入学习Javascript函数

深入学习Javascript函数
下拉加载更多内容 ↓