在null
上调用RegEx.prototype.test()时,JS运行时似乎将null
转换为其字符串形式("null"
),然后针对该字符串测试正则表达式。几个例子:
/[a-z]+/.test(null)
true
/null/.test(null)
true
/[0-9]+/.test(null)
false
/nnull/.test(null)
false
我的问题是:
这种行为非常不直观。由于null
在概念上表示没有任何对象,因此从概念上讲,针对它的RegEx测试会失败,因为应该没有任何东西可以测试。对于"null"
进行测试,很多基本的RegEx都不会有所帮助。
我已经在Node.js和Firefox Nightly中确认了这种行为。
答案 0 :(得分:2)
21.2.5.13 RegExp.prototype.test( S )
采取以下步骤:
- 设R为此值。
- 如果Type(R)不是Object,则抛出TypeError异常。
- 让字符串为ToString(S)。
- ReturnIfAbrupt(字符串)。
- 让匹配为RegExpExec(R,string)。
- ReturnIfAbrupt(匹配)。
- 如果match不为null,则返回true;否则返回false。
醇>
看看ToString(S),你会看到null =“null”,你得到你所看到的。
答案 1 :(得分:2)
是的,这是指定的。
2015版(第6版)中的每§21.2.5.13 "RegExp.prototype.test( S )",前几个步骤之一是将“ToString”操作应用于参数S,并使用其结果。 The "ToString" operation将各种非字符串值转换为字符串值;特别是null
会转换为"null"
。