JavaScript中使用函数做replace的第二个参数

通过第一个例子来全面看下作replace第二个参数的函数的参数。。。。听起来是有点绕→_→

例:

//第一参数为正则表达式

 1 var url = "http://www.softwhy.com/forum.php?mod=viewthread&tid=14743&extra=page%3D1";
 2 console.group("正则表达式");
 3 var regexp_global = /[?&](\w+)=([^&]*)/g; //全局匹配“参数名=参数值”
 4 var twoResult = url.replace(regexp_global,function(){
 5 console.log("第"+(count++)+"次运行");
 6       console.log("replace输入参数:%o",arguments);
 7       var val = regexp_global.exec(url);
 8       console.log("exec输出参数:%o",val);
 9
10       console.assert(arguments[0] === val[0]);
11       console.assert(arguments[1] === val[1]);
12       console.assert(arguments[2] === val[2]);
13       console.assert(arguments[3] === val["index"]);
14       console.assert(arguments[4] === val["input"]);
15       //console.arrert();用来判断一个表达式或变量是否为真。如果为否,则在控制台输出一条相应信息,并且抛出一个异常。
16       return count;
17 });
18 console.log("replace返回字符串:"+twoResult);
19 console.groupEnd("正则表达式");

运行结果:

  replace()函数第一个参数是正则表达式,并且执行的是全局匹配,第二个参数会多次被调用,每次调用和传递的参数,也是和regexp_global.exe(url)返回的元素内容是相同的(从console.assert()没有报错可以看出)。

  本例共有三对参数,所以能匹配三次,分别是”?mod=viewthread”, “&tid=14743”, “&extra=page%3D1”。

使用函数做replace函数的第二个参数,该函数的参数分别为:


变量名


代表的值


str


The matched substring. (Corresponds to $& above.)


p1, p2, ...


The nth parenthesized submatch string, provided the first argument to replace was aRegExp object. (Correspond to $1, $2, etc. above.)


offset


The offset of the matched substring within the total string being examined. (For example, if the total string was "abcd", and the matched substring was "bc", then this argument will be 1.)


s


The total string being examined.

  解释:

  1. 第一个参数str为匹配的值;
  2. 接下来几个参数p1,p2……分别是第n个带括号的子匹配字符串;(此例中的(\w+)和([^&]*),参数名和参数值两个);
  3. Offset参数为匹配的字符串在整个字符串中的位置或者说是相对开头的偏移量,此例中的”?mod=viewthread”偏移量为32,“&tid=14743”偏移量为47;
  4. s参数为整个字符串。

  该函数的返回值被用作替换字符串。

下面是应用中的一个例子:

JavaScript 框架设计 P59

格式化函数format

 1 function format(str, object){
 2     var array = Array.prototype.slice.call(arguments, 1);
 3     console.log(arguments);
 4     console.log(array);
 5     console.log("object is %s",object);
 6
 7 return str.replace(/\\?\#{([^{}]+)\}/gm,function(match, name){
 8     console.log("match is %s",match);
 9     console.log("name is %s",name);
10
11 if(match.charAt(0) == ‘\\‘){
12 return match.slice(1);
13 }
14 var index = Number(name);
15 console.log(index);
16 if(index >= 0){
17             return array[index];
18 }
19 if(object && object[name] !== void 0){
20 return object[name];
21 }
22 return ‘‘;
23 });
24 }
25 var a = format("Result is #{3},#{1}", 22, 23);
26 console.log(a);

运行结果:

  array = [22, 23]

  name的值不是参数序列,而是圆括号内的子匹配,此例为#{0},#{1}中的0和1,转换成array对应的下表数字。如果#{0}改为#{3},则第一次调用name为3,但是array中没有对应的元素。

第一次调用:

  match = #{0}

  name = “0”

  返回array[0] : 22

第二次调用:

  match = #{1}

  name = “1”

  返回array[1] : 23

参考:

http://www.softwhy.com/forum.php?mod=viewthread&tid=14743

https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/String/replace#Specifying_a_function_as_a_parameter

时间: 2024-08-02 15:12:20

JavaScript中使用函数做replace的第二个参数的相关文章

JavaScript中ceil函数

JavaScript中ceil函数是返回大于等于其数字参数的最小整数. 使用方法: Math.ceil(number)http://www.mlybyby.com 其中必选项number 参数是数值表达式. ceil函数返回值为大于等于其数字参数的最小整数.

JavaScript正则表达式详解(二)JavaScript中正则表达式函数详解

二.JavaScript中正则表达式函数详解(exec, test, match, replace, search, split) 1.使用正则表达式的方法去匹配查找字符串 1.1. exec方法详解 exec方法的返回值 exec方法返回的其实并不是匹配结果字符串,而是一个对象,简单地修改一下execReg函数,来做一个实验就可以印证这一点: function execReg(reg, str) { var result = reg.exec(str); alert(typeof result

JavaScript中Eval()函数的作用

Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/-->首先来个最简单的理解 eval可以将字符串生成语句执行,和SQL的exec()类似. eval的使用场合是什么呢?有时候我们预先不知道要执行什么语句,只有当条件和参数给时才知道执行什么语句,这时候eval就派上用场了.举个例子: 我们要做一个function(),功能是输入网页中两个个对象的名称,然后程

JavaScript中的函数表达式

在JavaScript中,函数是个非常重要的对象,函数通常有三种表现形式:函数声明,函数表达式和函数构造器创建的函数. 本文中主要看看函数表达式及其相关的知识点. 函数表达式 首先,看看函数表达式的表现形式,函数表达式(Function Expression, FE)有下面四个特点: 在代码中须出现在表达式的位置 有可选的函数名称 不会影响变量对象(VO) 在代码执行阶段创建 下面就通过一些例子来看看函数表达式的这四个特点. FE特点分析 例子一:在下面代码中,"add"是一个函数对象

Javascript中的函数(Function)与对象(Object)的关系

今天我们来尝试理解Function和Object.因为这个里面有些人前期可能会搞糊涂.他们之间到底是什么关系.当然也不除外当初的我. 注意:官方定义: 在Javascript中,每一个函数实际上都是一个函数对象. 我们先来看最简单的两个代码,也是最容易理解的. function fn(){} var obj = {} console.log(fn instanceof Function)//true console.log(obj instanceof Object)//true console

JavaScript中的函数的两种定义方式

<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Insert title here</title> <script type="text/javascript"> /*I总结: 1.函数名可以做变量使用,可以赋值,可以传值 2.函数名当参数,传递给另一个函数 */ //==================js中函

JavaScript中的函数(一)

javaScript中的函数实际上是对象,每一个函数都是Function类型的实例,和其他引用类型一样具有属性和方法.由于函数是对象,因此函数名实际上也就是一个指向函数对象的指针,也就是函数对象的一个引用,因此一个函数可以有多个名字. 1.函数定义的方式: 1)使用函数声明定义函数: function sum(num1,num2){ return num1+num2; } 2)使用函数表达式定义函数:定义变量sum并将其初始化为一个函数,变量sum可以引用函数.要注意函数末尾有一个分号,和声明变

JavaScript中charAt函数

JavaScript中charAt函数的作用是返回指定索引位置处的字符. 使用方法: strObj.charAt(index) 其中 strObj是必选项.任意 String 对象或文字. index是必选项.想得到的字符的基于零的索引.有效值是 0 与字符串长度减 1 之间的值. JavaScript中charAt函数返回一个字符值,该字符位于指定索引位置.字符串中的第一个字符的索引为 0,第二个的索引为 1,等等.超出有效范围的索引值返回空字符串. 下面的示例说明了 charAt 方法的用法

JavaScript中charCodeAt函数

JavaScript中charCodeAt函数是返回一个整数,代表指定位置上字符的 Unicode 编码. 使用方法为 strObj.charCodeAt(index) 其中 strObj是必选项.任何 String 对象或文字. index是必选项.将被处理的字符的从零开始计数的编号.有效值为 0 到字符串长度减 1 的数字. 一个字符串中的第一个字符编号为 0,第二个字符编号为 1,依此类推.如果指定位置没有字符,将返回 NaN. 以下示例阐明了 charCodeAt 方法的用法.http: