JavaScript:test vs exec

12 javascript

我想知道检查字符串的最佳方法是什么(邮件,密码..Etc).

/^...$/i.exec(a)
Run Code Online (Sandbox Code Playgroud)

VS

/^...$/i.test(a)
Run Code Online (Sandbox Code Playgroud)
  • exec返回值
  • 测试真实

测试:

// 1° way
var mail = req.body.mail;
if(check(mail)){
Run Code Online (Sandbox Code Playgroud)

EXEC:

// 1° way
var mail = req.body.mail;
if(check(mail)){

// 2° way
var mail = check(req.body.mail);
if(mail){
Run Code Online (Sandbox Code Playgroud)

执行测试?和什么号码(如果执行1°或2°)

对于这种情况,测试更好.

  • 它肯定会更快.

但最重要的是

  • test执行他所有的工作.虽然exec没有执行,因为可以做更多,但我们不需要.
  • 就像Mattias Buelens说的那样,使用isMail()它更合乎逻辑:是一封电子邮件:是或否.虽然exec:是电子邮件:email或null - > wtf?大声笑

Mat*_*ens 18

如果您只需要测试输入字符串以匹配正则表达式,RegExp.test则最合适.它将为您提供boolean返回值,使其成为条件的理想选择.

RegExp.exec为所有捕获组和匹配的索引提供类似于数组的返回值.因此,在匹配后需要使用捕获的组或索引时,它非常有用.(此外,与使用全局修改器时相比,它的行为略有不同)String.match/g

最终,速度或效率无关紧要.仍将评估正则表达式,并且所有匹配的组和索引都将通过全局RegExp对象可用(尽管强烈建议您使用返回值).

至于if测试,这只是个人品味的问题.将正则表达式测试的结果分配给具有有意义名称的变量(例如isEmail)可以提高可读性,但除此之外它们都很好.

  • 这是一个很好的解释,即使存在一些缺陷."`RegExp.exec`为你提供了一个类似于数组的返回值,**所有**捕获组和匹配的索引." 并不是的.它将返回一个数组,其中索引"[0]"中的第一个匹配项及其后续索引中的后续捕获组.它不返回所有匹配/捕获组,只返回与其所有捕获组的第一个匹配.但是,您使用例如`while`循环遍历它,它会自动将`lastIndex`属性存储在regex对象中,如您提供的MDN链接所示. (3认同)