replace()第二个参数为function时的小研究

大家都知道replace有两个参数,简单点说,第一个是要被替换的String(一般正则表达式),第二个是替换成的String,例如:var str="Visit Microsoft!"
document.write(str.replace(/Microsoft/, "W3School"))
(w3c上的例子第一个);

很多时候我们可能用到第二个参数要被规定为函数的情况(很常见,比如你要对匹配到的String进行一些类似截取什么的操作的时候),那么我们就需要知道这个函数的几个参数的定义,这里引用规定的内用容:

ECMAScript v3 规定,replace() 方法的参数 replacement 可以是函数而不是字符串。在这种情况下,每个匹配都调用该函数,它返回的字符串将作为替换文本使用。该函数的第一个参数是匹配模式的字符串。接下来的参数是与模式中的子表达式匹配的字符串,可以有 0 个或多个这样的参数。接下来的参数是一个整数,声明了匹配在 stringObject 中出现的位置。最后一个参数是 stringObject 本身。>

解释一下:如:
正则:/&([^&;]+);/g 匹配的String:& lt;& quot; & qt;
function(a,b,c,d)

< lt 0 <">
" quot 4 <">
> gt 10 <">

这就是a,b,c,d对应的结果。

注意:当你的正则没有子表达式时(就是正则表达式中没有()),函数就相当于有三个参数了,b就没有了,调用的时候应该注意这一点。

最后,放一个《javaScript语言精粹》上的代码,加强一下理解,
这个代码本身是模块化的一个体现(函数+闭包)

String.prototype.box=function(){
    var entity={
        quot:'"',
        lt:'<',
        gt:'>'
    };
    return function(){
        return this.replace(/&([^&;]+);/g,function(a,b,c,d){
        //console.log(a,b,c,d)
           var r=entity[b];
            return typeof  r==='string' ? r : a;
        });
    }
}();
document.writeln('<">'.box());

你可以在浏览器的控制台中用console.log(a,b,c,d)来看一下结果。

你可能感兴趣的:(前端笔记)