带有元素标签名的regexp错误

bug regexp with element tagname?

本文关键字:regexp 错误 标签名 元素      更新时间:2023-09-26

简单的问题,谁能给我解释一下?

http://jsfiddle.net/paj5c4wn/4/

// check body tagname, return bool
var check = (function ()
{
    var body = /body/gi;
    return function ( str )
    {
        return body.test( str );
    }
})();
// get body element
var body = document.body;
// display result
for ( var i = 0; i < 10; i++ )
{
    document.getElementById( 'result-' + i ).innerHTML = check( body.tagName );
}

:

<p id="result-0" ></p>
<p id="result-1" ></p>
<p id="result-2" ></p>
...

:

true
false
true
false
...

怎么可能?

有两种可能的解决方案:

  1. 您的代码总是使用对body变量的相同引用。结合正则表达式中的g全局标志,RegExp.prototype.test()记录并使用regex匹配的最后一个索引开始搜索。

    首先,在for循环的第一次迭代中,/body/gi匹配'BODY',得到true。然后,在第二次函数调用时,它开始匹配索引4中的字符串。因此,它从'BODY'字符串的末尾开始,因此显然没有匹配结果,返回false。然后在第三次测试时,索引被重置,因为字符串之前没有匹配,整个过程重复。

    为了解决这个问题,您可以删除闭包中的body变量,以允许在每个函数调用时创建一个新的正则表达式对象,每个函数调用的初始索引为0。

  2. 您可以简单地删除g全局标志,因为这个特定的匹配只需要执行一次。如果没有g标志,JavaScript正则表达式对象将不会保留最后一个索引。相反,索引将在每次执行后自动重置为零。

组合两个选项(因为全局标志在这种情况下是不必要的):

// check body tagname, return bool
var check = (function ()
{
    return function ( str )
    {
        return /body/i.test( str );
    }
})();
// get body element
var body = document.body;
// display result
for ( var i = 0; i < 10; i++ )
{
    document.getElementById( 'result-' + i ).innerHTML = check( body.tagName );
}