为什么语句if(!condition){console.log(condition)}显示为true

时间:2014-01-29 08:09:02

标签: javascript regex

我想创建一个String方法,它接受一个RegExp和一个回调,然后通过RegExp拆分String,并在split数组中插入回调的返回。简而言之,它会做这样的事情:

"a 1 b 2 c".method(/\d/, function ($1) { return $1 + 1; })
    => [a, 2, b, 3, c]

如果String与RegExp不匹配,它应该返回一个数组,如下所示:

"a b c d e".method(/\d/, function ($1) { return $1 + 1; })
    => ["a b c d e"]

我编写了这段代码,但它并没有像我想的那样工作:

String.prototype.preserveSplitReg = function(reg, func) {

    var rtn = [], 
        that = this.toString();
    if (!reg.test(that)) {
        console.log(reg, that, reg.test(that));
        return [that];
    }

    ...
}

当String与reg不匹配时,应该只调用console.log,对吧?但有时它会记录(reg, that, true)。麻烦的字符串和reg是:

"See <url>http://www.w3.org/TR/html5-diff/</url> for changed elements and attributes, as well as obsolete elements and"
/<url>.*?<\/url>/g

控制台记录为true。我无法弄清楚为什么。任何帮助都将受到高度赞赏。

1 个答案:

答案 0 :(得分:6)

这是due to a bug in Javascript RegEx engine (ECMAScript3)

基本上使用g修饰符的正则表达式无法正确重置,因此多个test()调用会在true and false之间切换。