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