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

为什么JavaScript RegExp/^\w+;$/匹配未定义?,javascript,regex,firefox,Javascript,Regex,Firefox,为什么RegExp/^\w+$/匹配未定义的 示例代码: alert(/^\w+$/.test(undefined)); 这将在Firefox 3中显示为真(只有我测试过它的浏览器)。当未定义的被转换为字符串时(正则表达式就是这样做的),它会生成字符串“未定义的”,然后进行匹配 /(\w)(\w)(\w)(\w)(\w)/.exec(undefined); 返回:[“未定义”、“u”、“n”、“d”、“e”、“f”] 它将undefined视为字符串“undefined”参见ECMASc

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

示例代码:

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

这将在Firefox 3中显示为真(只有我测试过它的浏览器)。

未定义的
被转换为字符串时(正则表达式就是这样做的),它会生成字符串
“未定义的”
,然后进行匹配

/(\w)(\w)(\w)(\w)(\w)/.exec(undefined);  
返回:
[“未定义”、“u”、“n”、“d”、“e”、“f”]


它将undefined视为字符串
“undefined”

参见ECMAScript规范第15.10.6.2节,了解将从.match方法调用的RegExp.prototype.exec(字符串)。当计算为true时,match基本上是exec

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

  • 让我们成为ToString(string)的值
  • 设length为S的长度
  • 设lastIndex为lastIndex属性的值
  • 我是ToInteger(lastIndex)的值
  • 如果全局属性为false,则设i=0
  • 如果I<0或I>length,则将lastIndex设置为0并返回null
  • 调用[[Match]],为其提供参数S和i。如果[[Match]]返回失败,则转至步骤8; 否则,让r作为其状态结果,并转至步骤10
  • 设i=i+1
  • 转至步骤6
  • 设e为r的endIndex值
  • 正如您所看到的,它将把任何输入转换为字符串,因此undefined变为“undefined”,这将与true匹配


    在命令行中使用JScript在浏览器外部进行了测试,得到了相同的结果。

    可能有点。。。但是JavaScript中没有真正的异常概念或类似概念,一点古怪的行为总比默默死去要好。不过,在我(无可否认,相当有限)的经历中,还是有一些错误(),在大多数情况下,它们没有那么多用处……糟糕的语言设计。当你测试是否存在任何值的字符串时,这在JS中会成为一个大问题。当字符串变量已定义但未填充时,如var str;那么它的值就是未定义的属性。它被test()方法强制为字符串类型,并且在逻辑上表现为字符串实际上已定义并设置为字符串值“undefined”。因此,不要使用test()检查字符串是否存在,或者如果存在,请先显式检查未定义的字符串。