1,replace() 方法的第二个参数 replacement 可以是函数而不是字符串。
在这种情况下,每个匹配都调用该函数,它返回的字符串将作为替换文本使用。
function(a,b,c,d)
该函数的第一个参数是匹配模式的字符串,第二个参数是与模式中的子表达式匹配的字符串,可以有 0 个或多个这样的参数第三个参数是一个整数,声明了匹配在 stringObject 中出现的位置,最后一个参数是 stringObject 本身。
JavaScript语言精粹中,第4 章函数一节,模块小节中提供了:
String.method("deentityify",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('<">'.deentityify( ));
博主跑了该函数,发现无法输出。
将String添加新方法的部分改为了原型添加:
String.prototype.deentityify=function() { }();可以正常输出。
观察console.log(a,b,c,d)
可以看到第一次:a为匹配到的字符串,b为对应替换的字符串,c为替换的位置,d为整个要替换的字符串。
因为有三次符合条件,所以调用了三次函数。
2,replace()方法的第二个参数可以为“$”,$有特殊含义。
replacement 中的 $ 字符具有特定的含义。如下表所示,它说明从模式匹配得到的字符串将用于替换。
字符 | 替换文本 |
---|---|
$1、$2、...、$99 | 与 regexp 中的第 1 到第 99 个子表达式相匹配的文本。 |
$& | 与 regexp 相匹配的子串。 |
$` | 位于匹配子串左侧的文本。 |
$' | 位于匹配子串右侧的文本。 |
$$ | 直接量符号。 |