编程语言
首页 > 编程语言> > Javascript-为什么此QUnit RegExp测试失败?

Javascript-为什么此QUnit RegExp测试失败?

作者:互联网

我在弄乱QUnit,偶然发现了一件事.

我在Chrome上尝试了以下简单测试:

deepEqual(new RegExp(), /(?:)/);

我假设它将通过,因为新的RegExp()在开发人员控制台中返回/(?:)/.对于RegExps,似乎不可能“仅仅”做新的RegExp()=== /(?:)/,但是两者的toString()函数都返回相同且相等的值.

我认为文字/非文字表示法会有所作为,但是由于此测试通过,所以情况并非如此:

deepEqual(new RegExp(" "), / /);

因此,从以下测试中,第一个失败:

test("test", function() {
    deepEqual(new RegExp(), /(?:)/); // fail
    deepEqual(new RegExp(" "), / /); // pass
    equal(new RegExp().toString(), /(?:)/.toString()); // pass
});

因此,有人能为我指出正确的方向,为什么第一次测试失败了吗?

解决方法:

简短的答案:正则表达式/(?:)/和从新RegExp()获得的对象的source属性值是不同的.对于文字,它是/(?:)/,而对于对象,则是一个空字符串.当您使用//和新的RegExp(“”)时,source属性的值是相同的(都是具有一个空格字符的字符串).

长答案:如果您查看Qunit的源代码,您将看到以下代码:

"regexp": function (b, a) {
    return QUnit.objectType(b) === "regexp" &&
        a.source === b.source && // the regex itself
        a.global === b.global && // and its modifers (gmi) ...
        a.ignoreCase === b.ignoreCase &&
        a.multiline === b.multiline;
};

您可以使用以下代码查看source参数有何不同(它仅输出每个regex参数的属性并测试它们的相等性):

function eq(x, y) {
   console.log("x.source:", "'" + x.source + "'", "y.source:", "'" + y.source + "'", "===:", x.source === y.source);
   console.log("x.global:", x.global, "y.global:", y.global, "===:", x.global === y.global);
   console.log("x.ignoreCase:", x.ignoreCase, "y.ignoreCase:", y.ignoreCase, "===:", x.ignoreCase === y.ignoreCase);
   console.log("x.multiline:", x.multiline, "y.multiline:", y.multiline, "===:", x.multiline === y.multiline);
}

当使用eq(/(??)/,new RegExp());调用此函数时,将得到:

x.source: '(?:)' y.source: '' ===: false
x.global: false y.global: false ===: true
x.ignoreCase: false y.ignoreCase: false ===: true
x.multiline: false y.multiline: false ===: true

而当您使用eq(/ /,new RegExp(“”))调用它时;你得到:

x.source: ' ' y.source: ' ' ===: true
x.global: false y.global: false ===: true
x.ignoreCase: false y.ignoreCase: false ===: true
x.multiline: false y.multiline: false ===: true

标签:qunit,unit-testing,javascript,regex
来源: https://codeday.me/bug/20191208/2091955.html