JavaScript null 参数使正则表达式匹配

JavaScript null argument makes the regex match

本文关键字:正则表达式 null 参数 JavaScript      更新时间:2023-09-26

我正在编写一个用于JavaScript的正则表达式。在测试时,我遇到了一些奇怪的行为,并将其归结为以下内容:

/^[a-z]/.test("abc"); // <-- returns true as expected
/^[a-z]/.test(null);  // <-- returns true, but why?

我假设最后一种情况将返回false因为它不符合正则表达式(值为 null,因此不要以范围内的字符开头)。那么,谁能解释为什么不是这样?

如果我在 C# 中执行相同的测试:

var regex = new Regex("^[a-z]");
var res = regex.IsMatch(null); // <-- ArgumentNullException

。我得到了一个有道理的ArgumentNullException。所以,我想在 JavaScript 中测试正则表达式时,您必须手动进行null检查?

我试图寻找解释,但没有任何运气。

那是因为test转换了它的参数:null被转换为"null"字符串。

您可以在控制台中检查:

/^null$/.test(null)

返回true

ToString(argument) 的调用在 ECMAScript 规范中指定(另请参阅 ToString)。

在这里,null被类型转换为String "null"的形式。

"null"与您提供的正则表达式匹配,这就是为什么它评估为true

在Javascript中,所有内容(或大部分)都是具有ToString方法的Object,如果需要类型转换,该方法将在内部自动调用。