关于JavaScript中string 的replace

replace() 方法用于在字符串中用一些字符替换另一些字符,或替换一个与正则表达式匹配的子串。

语法:string.replace(subStr/reg,replaceStr/function)

第一个参数可以是字符串的子字符串,也可以是一个正则表达式,第二个参数可以是一个字符串或者一个处理方法,下面我们分别看看

复制代码 代码如下:


document.write('1234'.replace(1, 'X'));我们可以得到结果:X234,很正常,但是


复制代码 代码如下:


document.write('1214'.replace(1, 'X'));我们预想结果应该是:X2X4,但是得到的结果却是:X214,也就是说如果我们第一个参数写的是子字符串,那么replace只替换第一个匹配就停止搜索


我们换为正则的写法

复制代码 代码如下:


document.write('1214'.replace(/1/g, 'X'));这时候我们可以得到预想结果:X2X4


我们看看function的写法

复制代码 代码如下:


var r = 'abcd'.replace(/\w/g, function() {
            return 'X';
        });
        document.write(r);


这时我们可以看到预想结果:XXXX,所有字符被替换为X,这是我之前对replace的认识,但我在JavaScript语言精粹上看到这样一个例子,我迷惑了

复制代码 代码如下:


var t = document.getElementById('t');
        String.prototype.deentityfy = function() {
            var entity = {
                quot: '"',
                lt: '<',
                gt: '>'
            };
            return function() {
                return this.replace(/&([^&;]+);/g, function(a, b) {
                   var r = entity[b];
                    return typeof r === 'string' ? r : a;
                }); //end of replace
            };
        } ();

document.write('&lt;&quot;&gt;'.deentityfy());


这段代码是为JavaScript的String对象添加一个deentityfy 方法,用以替换字符串中得HTML字符(把&quot;替换为”,&lt;替换为<,&gt;替换为>),我们先忽略作者使用的语言技巧,看看他的replace是怎么用的,第一个参数是一个正则表达式,是匹配之前提到的三个字符串,第二个参数的function竟然有了两个参数,这两个参数到底是什么?为什么方法却得到了预想结果,我们来简单分析一下。

首先entity[b]是JavaScript关联数组的用法,根据数组数据的name得到value,为了方便理解,我们不妨改造一下这个方法,让它变得简单些,让我们可以更清楚地看到function的参数到底是什么,同时为了消除浏览器转码问题,我们修改一下替换字符串

复制代码 代码如下:


String.prototype.deentityfy = function() {
         var entity = {
             a: 'A',
             b: 'B',
             c: 'C'
         };
         return function() {
             return this.replace(/1([^12])2/g, function(a, b) {
                 for (var i = 0; i < arguments.length; i++) {
                     document.write(arguments[i] + '<br/>');
                 }
                 document.write('===========================<br/>');
                 var r = entity[b];
                 return typeof r === 'string' ? r : a;
             }); //end of replace
         };
     } ();
     document.write('1a21b21c2'.deentityfy());


这样,我们把方法的参数都打印出来,看看结果是什么

复制代码 代码如下:

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wdgxsx.html