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

建议37:推荐使用replace(1)
String对象的replace方法包含两个参数,第一个参数表示执行匹配的正则表达式,也可以传递字符串,第二个参数表示准备代替匹配的子字符串,例如,把字符串html替换为htm。

  1. var b = s.replace("html", "htm" );
    与search和match方法不同,replace方法不会把字符串转换为正则表达式对象,而是以字符串直接量的文本模式进行匹配。第二个参数可以是替换的文本,或者是生成替换文本的函数,把函数返回值作为替换文本来替换匹配文本。

replace方法同时执行查找和替换两个操作。该方法将在字符串中查找与正则表达式相匹配的子字符串,然后调用第二个参数值或替换函数替换这些子字符串。如果正则表达式具有全局性质,那么将替换所有的匹配子字符串,否则,只替换第一个匹配子字符串。
在replace方法中约定了一个特殊的字符“$”,如果这个美元符号附加了一个序号,就表示引用正则表达式中匹配的子表达式存储的字符串。例如:

  1. var s = "javascript";
  2. var b = s.replace( /(java)(script)/, "$2-$1");
  3. alert( b ); //"script-java"
    在上面的代码中,正则表达式/(java)(script)/中包含两对小括号,按顺序排列,其中第一对小括号表示第一个子表达式,第二对小括号表示第二个子表达式,在replace方法的参数中可以分别使用字符串"$1"和"$2"来表示对它们匹配文本的引用,当然它们不是标识符,仅是一个标记,所以不可以作为变量参与计算。除了上面约定之外,美元符号与其他特殊字符组合还可以包含更多的语义,详细说明如下:
  4. $1、$2、…、$99:与正则表达式中的第1~99个子表达式相匹配的文本。
  5. $&(美元符号+连字符):与正则表达式相匹配的子字符串。
  6. $`(美元符号+切换技能键):位于匹配子字符串左侧的文本。
  7. $'(美元符号+单引号):位于匹配子字符串右侧的文本。
  8. $$:表示$符号。
  9. var s = "javascript";
  10. var b = s.replace( /.*/, "$&$&"); //" javascriptjavascript "
    由于字符串“$&”在replace方法中被约定为正则表达式所匹配的文本,因此利用它可以重复引用匹配的文本,从而实现字符串重复显示效果。其中正则表达式“/.*/”表示完全匹配字符串。
  11. var s = "javascript";
  12. var b = s.replace( /script/, "$& != $`"); //"javascript != java"
    其中字符“$&”代表匹配子字符串“script”,字符“$`”代表匹配文本左侧文本“java”。
  13. var s = "javascript";
  14. var b = s.replace( /java/, "$&$' is "); //"javascript is script"
    其中字符“$&”代表匹配子字符串“java”,字符“$'”代表匹配文本右侧文本“script”。然后用“$&$' is”所代表的字符串“javascript is”替换原字符串中的“java”子字符串,即组成一个新的字符串“javascript is script”。

在ECMAScript v3中明确规定,replace方法的第二个参数建议使用函数,而不是字符串(当然不是禁止使用),JavaScript 1.2实现了对这个特性的支持。这样,当replace方法执行匹配时,每次都会调用该函数,函数的返回值将作为替换文本执行匹配操作,同时函数可以接收以$为前缀的特殊字符组合,用来对匹配文本的相关信息进行引用。

  1. var s = 'script language = "javascript" type= " text / javascript"';
  2. var f = function($1){
  3. return $1.substring(0,1).toUpperCase() + $1.substring(1);
  4. }
  5. var a = s.replace( /(bw+b)/g, f );
  6. alert(a); //Script Language = "JavaScript" Type = " Text /JavaScript"
时间: 2024-10-10 05:30:59

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

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

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

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的策略是让