我正在编写一个正则表达式,用于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
检查吗?
我试着寻找一个解释,但没有任何运气。
发布于 2014-12-08 05:51:39
这是因为test
转换它的参数:null
被转换成"null"
字符串。
您可以在控制台中检查:
/^null$/.test(null)
返回true
。
对ToString(argument)
的调用是在ECMAScript specification中指定的(参见ToString)。
发布于 2014-12-08 05:52:18
在这里,null
正在将类型转换为String
表单,即"null"
。
"null"
与您提供的regex匹配,这就是它要计算到true
的原因。
在Javascript中,所有内容(或大部分)都是一个Object
,它具有ToString
方法,如果需要进行类型传递,该方法将在内部自动调用。
https://stackoverflow.com/questions/27359464
复制相似问题