针对空值testingRegEx
在null
上调用RegEx.prototype.test()时,JS运行时似乎将null
转换为它的stringforms( "null"
),然后对此testing正则expression式。 几个例子:
/[az]+/.test(null) true /null/.test(null) true /[0-9]+/.test(null) false /nnull/.test(null) false
我的问题是:
- 为什么?
- 根据目前的规格,这是正确的行为?
这种行为是非常不直观的。 由于null
概念上代表没有任何对象,所以从概念上讲,RegExtesting对它会失败,因为应该没有什么可以testing的。 许多基本的正则expression式都无法成功地对"null"
进行testing。
我已经在Node.js和Firefox Nightly中确认了这种行为。
是的,这是指定的。
根据2015版(第6版)第21.2.5.13节“RegExp.prototype.test(S)” ,前几个步骤之一是对参数S应用“ToString”操作,并使用其结果。 “ToString”操作将各种非string值转换为string值; null
特别是被转换为"null"
。
21.2.5.13 RegExp.prototype.test(S)
采取以下步骤:
- 设R是这个值。
- 如果Type(R)不是Object,则抛出一个TypeErrorexception。
- 设string为ToString(S)。
- ReturnIfAbrupt(串)。
- 让匹配成为RegExpExec(R,string)。
- ReturnIfAbrupt(匹配)。
- 如果匹配不为空,则返回true; 否则返回false。
看看ToString(S)你会看到null =“null”,你会看到你所看到的。