针对Null测试RegEx

时间:2016-02-18 05:05:10

标签: javascript regex node.js

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

我的问题是:

  1. 为什么?
  2. 根据当前规范,这是正确的行为吗?
  3. 这种行为非常不直观。由于null在概念上表示没有任何对象,因此从概念上讲,针对它的RegEx测试会失败,因为应该没有任何东西可以测试。对于"null"进行测试,很多基本的RegEx都不会有所帮助。

    我已经在Node.js和Firefox Nightly中确认了这种行为。

2 个答案:

答案 0 :(得分:2)

21.2.5.13 RegExp.prototype.test( S )

  

采取以下步骤:

     
      
  1. 设R为此值。
  2.   
  3. 如果Type(R)不是Object,则抛出TypeError异常。
  4.   
  5. 让字符串为ToString(S)。
  6.   
  7. ReturnIfAbrupt(字符串)。
  8.   
  9. 让匹配为RegExpExec(R,string)。
  10.   
  11. ReturnIfAbrupt(匹配)。
  12.   
  13. 如果match不为null,则返回true;否则返回false。
  14.   

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

答案 1 :(得分:2)

是的,这是指定的。

2015版(第6版)中的每§21.2.5.13 "RegExp.prototype.test( S )",前几个步骤之一是将“ToString”操作应用于参数S,并使用其结果。 The "ToString" operation将各种非字符串值转换为字符串值;特别是null会转换为"null"