2012-06-12 2 views
10

Я хотел бы знать, что лучше всего проверить строку, например (mail, password ..Etc).JavaScript: test vs exec

/^...$/i.exec(a) 

против

/^...$/i.test(a) 
  • Exec возвращает значение
  • тест истинный

тест:

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

Exec:

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

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

Exec или тест? и какое число (1 ° или 2 °, если Exec)

РЕШЕНИЕ

тест лучше для этого случая.

  • это, безусловно, будет быстрее.

Но самое главное

  • тест выполняет всю свою работу. В то время как exec не работал, потому что больше можно сделать, но не требуется.
  • Как указано Mattias Buelens, используя isMail(), это более логично: это электронная почта: да или нет. В то время как exec: есть электронная почта: адрес электронной почты или null -> wtf? lol
+0

Что вы подразумеваете под «лучшим способом»? – j08691

+0

1-й. Зависит от того, что вы пытаетесь сделать. Нужны ли вам соответствующие/захватывающие группы и т. Д. Или просто проверка, чтобы проверить, соответствует ли предоставленная строка регулярному выражению? Кроме того, второй вопрос основан на предпочтении, он будет иметь тот же результат. Вы должны выбрать, какая из них более читабельна и удобна для вас/вашей команды. –

+0

есть два решения, есть разные, поэтому я думаю, что один из них лучше всего ** РЕДАКТИРОВАТЬ ** @ Fabrício Matté: просто подтвердите. Да, я думаю, что первый способ лучше, потому что это более читаемая логика. (для вас;)) –

ответ

15

Если вам нужно всего лишь протестировать строку ввода в соответствии с регулярным выражением, то наиболее подходящим является RegExp.test. Это даст вам boolean возвращаемое значение, которое делает его идеальным для условий.

RegExp.exec дает возвращаемое значение типа массива со всеми группами захвата и согласованными индексами. Поэтому это полезно, когда вам нужно работать с захваченными группами или индексами после матча. (Также it behaves a bit different по сравнению с String.match при использовании глобального модификатора /g)

В конечном счете, это не будет иметь большого значения в скорости или эффективности. Регулярное выражение будет по-прежнему оцениваться, и все соответствующие группы и индексы будут доступны через глобальный объект RegExp (хотя настоятельно рекомендуется использовать возвращаемые значения).

Что касается теста if, это только вопрос личного вкуса.Присвоение результата теста регулярного выражения переменной с значимым именем (например, isEmail) может улучшить читаемость, но, кроме того, они оба хороши.

+3

Это хорошее объяснение, хотя есть некоторые недостатки. «RegExp.exec» дает возвращаемое значение типа массива с ** всеми группами захвата ** и совпадающими индексами ». На самом деле, нет. Он вернет массив с первым совпадением в индекс '[0]' и его последующие группы захвата в следующих индексах. Он не возвращает все соответствия/группы захвата, только первое совпадение со всеми его группами захвата. Тем не менее, вы повторяете его с помощью, например, цикл while, который автоматически сохраняет свойство lastIndex в объекте regex, как показано в предоставленной вами ссылке MDN. –