任何人都可以解释这一点(使用节点版本4.2.4 repl)?Javascript正则表达式测试怪异
var n; //undefined
/^[a-z0-9]+$/.test(n); // true!
/^[a-f0-9]+$/.test(n); // false
任何人都可以解释这一点(使用节点版本4.2.4 repl)?Javascript正则表达式测试怪异
var n; //undefined
/^[a-z0-9]+$/.test(n); // true!
/^[a-f0-9]+$/.test(n); // false
传递给.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
它说:
- 设R为此RegExp对象。
- 设S是ToString(字符串)的值。
所以基本上你正在测试:
/^[a-z0-9]+$/.test("undefined"); // true!
/^[a-f0-9]+$/.test("undefined"); // false
现在应该是显而易见的,为什么第二个测试返回false
。测试模式中不包括字母u
,n
和i
。
注:在规范功能ToString()
是指在底层实现(最有可能C或C++虽然存在JS的另外的实现,如Java和转到其他语言)的强制类型转换功能。它没有提到js中的全局函数toString()
。因此,规范中的第二行基本上意味着undefined
将被视为"" + undefined
,其返回"undefined"
。
可能它将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.
RegExp.test
将n
作为字符串"undefined"
。
因此,范围[a-f]
不涵盖undefined
字符串的所有字符。
在你的情况下,“mimimum允许”的范围传递的正则表达式检查将是[a-u]
var n; //undefined
console.log(/^[a-u]+$/.test(n)); // true
到底是什么尚不清楚?正则表达式试图匹配什么? – Xufox
由于'test()'期望一个字符串,所以它现在被转换为一个字符串''undefined“'。 ''undefined“'通过第一次测试,但不通过第二次 – Musa
一个正则表达式有一个Z,其他的有一个-F,第二种情况会失败,因为你不在-F范围内 –