针对空值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 

我的问题是:

  1. 为什么?
  2. 根据目前的规格,这是正确的行为?

这种行为是非常不直观的。 由于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)

采取以下步骤:

  1. 设R是这个值。
  2. 如果Type(R)不是Object,则抛出一个TypeErrorexception。
  3. 设string为ToString(S)。
  4. ReturnIfAbrupt(串)。
  5. 让匹配成为RegExpExec(R,string)。
  6. ReturnIfAbrupt(匹配)。
  7. 如果匹配不为空,则返回true; 否则返回false。

看看ToString(S)你会看到null =“null”,你会看到你所看到的。