gpt4 book ai didi

javascript - 为什么这个 QUnit RegExp 测试失败了?

转载 作者:行者123 更新时间:2023-11-29 10:53:16 24 4
gpt4 key购买 nike

我正在研究 QUnit,偶然发现了一件事。

我在 Chrome 上尝试了这个简单的测试:

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

我假设它会通过,因为 new RegExp() 在 Developer Console 中返回 /(?:)/。似乎不可能为 RegExp 执行 new RegExp() ===/(?:)/,但是 toString() 两者的函数返回相同且 相等。

我认为文字/非文字符号会有所不同,但事实并非如此,因为这个测试通过了:

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

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

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

因此,有人可以为我指出正确的方向,说明第一次测试失败的原因吗?

最佳答案

简答:source 属性的值对于正则表达式 /(?:)/ 和您的对象是不同的从 new RegExp() 获取。对于文字,它是 /(?:)/,而对于对象,它是一个空字符串。当你做//new 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;
};

您可以使用此代码查看源参数有何不同(它只是输出每个正则表达式参数的属性并测试它们是否相等):

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

关于javascript - 为什么这个 QUnit RegExp 测试失败了?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5707350/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com