JS编程建议——37:推荐使用replace(2)

建议37:推荐使用replace(2)
在上面的示例代码中,函数f()的参数为特殊字符“$1”,它表示正则表达式/(bw+b)/中小括号每次匹配的文本。然后在函数体内对这个匹配文本进行处理,截取其首字母并转换为大写形式,之后返回新处理的字符串。replace方法能够在原文本中使用这个返回的新字符串替换每次匹配的子字符串。
对于上面的示例,可以使用小括号来获取更多匹配文本的信息。例如,直接利用小括号传递单词的首字母,然后进行大小写转换处理:

  1. var s = 'script language = "javaScript" type= " text / javaScript"';
  2. var f = function($1,$2,$3){
  3. return $2.toUpperCase()+$3;
  4. }
  5. var a = s.replace( /b(w)(w*)b/g, f );
    //Script Language = "JavaScript" Type = " Text /JavaScript"

在函数f()中,第一个参数表示每次匹配的文本,第二个参数表示第一个小括号的子表达式所匹配的文本,即单词的首字母,第二个参数表示第二个小括号的子表达式所匹配的文本。
实际上,replace方法的第二个参数(函数式参数)不需要传递任何形参,replace方法依然会向它传递多个实参,这些实参都包含一定的意思,具体说明如下:
第一个参数表示与匹配模式相匹配的文本,如上面示例中每次匹配的单词字符串。
其后的参数是与匹配模式中子表达式相匹配的字符串,参数个数不限,根据子表达式数而定。
后面的参数是一个整数,表示匹配文本在字符串中的下标位置。
最后一个参数表示字符串自身。
例如,将上面示例中替换文本函数改为如下形式。

  1. var f = function(){
  2. return arguments[1].toUpperCase()+arguments[2];
  3. }
    如果不为函数传递形参,直接调用函数的arguments属性,同样能够读取到正则表达式中相关匹配文本的信息。

arguments[0]表示每次匹配的单词。
arguments[1]表示第一个子表达式匹配的文本,即单词的首字母。
arguments[2]表示第二个子表达式匹配的文本,即单词的余下字母。
arguments[3]表示匹配文本的下标位置,如第一个匹配单词“script”的下标位置就是0,依此类推。
arguments[4]表示要执行匹配的字符串,这里表示“script language = "javascript" type= " text / javascript"”。

  1. var s = 'script language = "javascript" type= " text / javascript"';
  2. var f = function(){
  3. for( var i = 0; i < arguments.length; i ++ ){
  4. alert("第"+(i+1)+"个参数的值:"+arguments[i]);
  5. }
  6. }
  7. var a = s.replace( /b(w)(w*)b/g, f );
    在函数体中,使用for循环结构遍历argumnets属性,每次匹配单词时,都会弹出5次提示信息,分别显示上面所列的匹配文本信息。其中,arguments[1]、arguments[2]会根据每次匹配文本不同,分别显示当前匹配文本中子表达式匹配的信息,arguments[3]显示当前匹配单词的下标位置。而arguments[0]总是显示每次匹配的单词,arguments[4]总是显示被操作的字符串。

例如,下面代码能够自动提取字符串中的分数,进行汇总后算出平均分,然后利用replace方法提取每个分值,与平均分进行比较以决定替换文本的具体信息。

  1. var s = "张三56分,李四74分,王五92分,赵六84分";
  2. var a = s.match( /d+/g ), sum = 0;
  3. for( var i= 0 ; i
  4. sum += parseFloat(a[i]);

};var avg = sum / a.length;function f(){var n = parseFloat(arguments[1]);return n + "分" + " ( " + (( n > avg ) ? ( "超出平均分" + ( n - avg ) ) :( "低于平均分" + ( avg - n ) )) + "分 ) ";}var ss1 = s.replace( /(d+)分/g, f );
alert( s1 );/ "张三56分(低于平均分20.5分),李四74分(低于平均分2.5分),王五92分(超出平均分15.5分), 赵六84分 ( 超出平均分7.5分)"/

在上面的示例中,遍历数组时不能够使用for in语句,因为这个数组中还存储着其他相关的匹配文本信息。应该使用for结构来实现。由于截取的数字都是字符串类型,所以应该把它们都转换为数值类型,否则会被误解,如把数字连接在一起,或者按字母顺序进行比较等。

时间: 2024-10-12 20:18:14

JS编程建议——37:推荐使用replace(2)的相关文章

JS编程建议——37:推荐使用replace(1)

建议37:推荐使用replace(1)String对象的replace方法包含两个参数,第一个参数表示执行匹配的正则表达式,也可以传递字符串,第二个参数表示准备代替匹配的子字符串,例如,把字符串html替换为htm. var b = s.replace("html", "htm" ); 与search和match方法不同,replace方法不会把字符串转换为正则表达式对象,而是以字符串直接量的文本模式进行匹配.第二个参数可以是替换的文本,或者是生成替换文本的函数,把

JS编程建议——23推荐提高条件性能的策略

建议23:推荐提高条件性能的策略与循环相似,条件表达式决定JavaScript 运行流的走向.与其他语言一样,JavaScript也采用了if 和switch 两种条件结构.由于不同浏览器针对流程控制进行了不同的优化,因此两者在性能上并没有特别大的差异,主要还是根据需求形式进行分析和选择:条件数量较大,建议选择switch 结构,而不是if结构,这样可以使代码更易读:如果条件较少时,建议选择if结构. //条件少 if(found) { //执行代码 } else { //执行代码 } //条件

JS编程建议——59:推荐动态调用函数

建议59:推荐动态调用函数调用函数更便捷的方式是使用Function对象的call和apply方法.apply与call方法在本质上没有太大区别,只不过它们传递给函数的参数方式不同, apply是以数组形式进行参数传递,而call方法可以同时传递多个值.如果某个函数仅能够接收多个参数列表,而现在希望把一个数组的所有元素作为参数进行传递,那么使用apply方法就显得非常便利.function max(){ var m = Number.NEGATIVE_INFINITY; // 声明一个负无穷大的

JS编程建议——68:推荐使用链式语法

建议68:推荐使用链式语法使用过jQuery框架的读者,都会对jQuery简洁的语法.灵巧的用法赞叹不已,其中一个最大亮点就是jQuery的链式语法.在JavaScript中,很多方法没有返回值,一些设置或修改对象的某个状态却不返回任何值的方法就是典型的例子.如果让这些方法返回this,而不是undefined,那么就要启用级联功能,即所谓的链式语法.在一个级联中,单独一条语句可以连续调用同一个对象的很多方法.getElement('box'). move(350, 150). width(10

JS编程建议——21:推荐提高循环性能的策略(2)

建议21:推荐提高循环性能的策略(2)在每个循环中,每次运行循环体都要发生如下操作:第1步,在控制条件中读一次属性(items.length).第2步,在控制条件中执行一次比较(i < items.length).第3步,比较操作,观察条件控制体的运算结果是不是true(i < items.length == true).第4步,一次自加操作(i++).第5步,一次数组查找(items[i]).第6步,一次函数调用(process(items[i])).在这些简单的循环中,即使没有太多的代码,

JS编程建议——21:推荐提高循环性能的策略(1)

建议21:推荐提高循环性能的策略(1)每次运行循环体时都会产生性能开销,增加总的运行时间,即使是循环体中最快的代码,累计迭代上千次,也将带来不小的负担.因此,减少循环的迭代次数可获得显著的性能提升.例如: var iterations = Math.floor(items.length / 8), startAt = items.length % 8, i = 0; do { switch(startAt) { case 0: process(items[i++]); case 7: proce

JS编程建议——71:推荐分支函数

建议71:推荐分支函数分支函数解决的一个问题是浏览器之间兼容性的重复判断.解决浏览器之间的兼容性的一般方式是使用if逻辑来进行特性检测或能力检测,根据浏览器不同的实现来实现功能上的兼容,这样做的问题是,每执行一次代码,可能都需要进行一次浏览器兼容性方面的检测,这是没有必要的.能否在代码初始化执行的时候就检测浏览器的兼容性,在之后的代码执行过程中,就无须再进行检测了呢?答案是:能.分支技术就可以解决这个问题,下面以声明一个XMLHttpRequest实例对象为例进行介绍.var XHR = fun

JS编程建议——77:推荐作用域安全的构造函数

建议77:推荐作用域安全的构造函数构造函数其实是一个使用new运算符的函数.当使用new调用时,构造函数的内部用到的this对象会指向新创建的实例.function Person(name, age, job) { this.name = name; this.age = age; this.job = job; }var person = new Person("Nicholas", 34, 'software Engineer');在没有使用new运算符来调用构造函数的情况下,由于

JS编程建议——3:减少全局变量污染

建议3:减少全局变量污染定义全局变量有3种方式:在任何函数外面直接执行var语句. var f = 'value'; 直接添加一个属性到全局对象上.全局对象是所有全局变量的容器.在Web浏览器中,全局对象名为window. window.f = 'value'; 直接使用未经声明的变量,以这种方式定义的全局变量被称为隐式的全局变量. f = 'value'; 为方便初学者在使用前无须声明变量而有意设计了隐式的全局变量,然而不幸的是忘记声明变量成了一个非常普遍的现象.JavaScript的策略是让