为什么JavaScript RegExp / ^ \ w + $ /匹配未定义?

时间:2009-07-06 02:35:28

标签: javascript regex firefox

为什么RegExp /^\w+$/匹配undefined

示例代码:

alert(/^\w+$/.test(undefined));

这将在Firefox 3中显示为true(仅我在其上测试过的浏览器)。

3 个答案:

答案 0 :(得分:43)

undefined被强制转换为字符串(正则表达式)时,它会生成字符串"undefined",然后匹配。

答案 1 :(得分:4)

/(\w)(\w)(\w)(\w)(\w)/.exec(undefined);  

返回:["undef", "u", "n", "d", "e", "f"]

将undefined视为字符串"undefined"

答案 2 :(得分:4)

有关将从.match方法调用的RegExp.prototype.exec( string ),请参阅ECMAScript规范部分15.10.6.2。当它被评估为真时,匹配基本上是exec。

以下是规范中的逐字逐句: 对正则表达式执行字符串的正则表达式匹配,并返回包含匹配结果的Array对象,如果字符串不匹配,则返回null 搜索字符串ToString(string)以查找正则表达式模式的出现,如下所示:

  1. 设S为ToString(string)的值。
  2. 设长度为S的长度。
  3. 让lastIndex为lastIndex属性的值。
  4. 让我成为ToInteger(lastIndex)的值。
  5. 如果全局属性为false,则让i = 0。
  6. 如果我< 0或I>然后将lastIndex设置为0并返回null。
  7. 调用[[Match]],给它参数S和i。如果[[Match]]返回失败,请执行步骤8; 否则让r为其状态结果并转到步骤10.
  8. 设i = i + 1。
  9. 转到第6步。
  10. 设e为r的endIndex值。
  11. 正如您所看到的,它会将任何输入转换为字符串,因此未定义变为“未定义”且匹配为true。

    在命令行中使用JScript在浏览器外部测试它并获得相同的结果。