2016-08-01 70 views
0

任何人都可以解释这一点(使用节点版本4.2.4 repl)?Javascript正则表达式测试怪异

var n; //undefined 
/^[a-z0-9]+$/.test(n); // true! 
/^[a-f0-9]+$/.test(n); // false 
+0

到底是什么尚不清楚?正则表达式试图匹配什么? – Xufox

+1

由于'test()'期望一个字符串,所以它现在被转换为一个字符串''undefined“'。 ''undefined“'通过第一次测试,但不通过第二次 – Musa

+0

一个正则表达式有一个Z,其他的有一个-F,第二种情况会失败,因为你不在-F范围内 –

回答

1

传递给.test()的变量首先转换为字符串。这是在规范中规定:

http://www.ecma-international.org/ecma-262/5.1/#sec-15.10.6.3

指向:

http://www.ecma-international.org/ecma-262/5.1/#sec-15.10.6.2

它说:

  1. 设R为此RegExp对象。
  2. 设S是ToString(字符串)的值。

所以基本上你正在测试:

/^[a-z0-9]+$/.test("undefined"); // true! 
/^[a-f0-9]+$/.test("undefined"); // false 

现在应该是显而易见的,为什么第二个测试返回false。测试模式中不包括字母uni


注:在规范功能ToString()是指在底层实现(最有可能C或C++虽然存在JS的另外的实现,如Java和转到其他语言)的强制类型转换功能。它没有提到js中的全局函数toString()。因此,规范中的第二行基本上意味着undefined将被视为"" + undefined,其返回"undefined"

1

可能它将undefined转换为字符串。因此:

var pattern1 = /^[a-z0-9]+$/ 
var pattern2 = /^[a-f0-9]+$/ 
pattern1.test("undefined") // There are only letters 
pattern2.test("undefined") // defed match, but unin does not. 
0

RegExp.testn作为字符串"undefined"
因此,范围[a-f]不涵盖undefined字符串的所有字符。
在你的情况下,“mimimum允许”的范围传递的正则表达式检查将是[a-u]

var n; //undefined 
console.log(/^[a-u]+$/.test(n)); // true