2012-06-12 40 views
10

Tôi muốn biết cách tốt nhất để kiểm tra chuỗi chẳng hạn (thư, mật khẩu ..Etc).JavaScript: test vs exec

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

vs

/^...$/i.test(a) 
  • exec trả về giá trị
  • kiểm tra đúng

kiểm tra:

// 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 hoặc kiểm tra? và những gì số (1 ° hoặc 2 ° nếu exec)

SOLUTION

kiểm tra là tốt hơn cho trường hợp này.

  • nó chắc chắn sẽ nhanh hơn.

Nhưng quan trọng nhất

  • kiểm tra thực hiện tất cả các công việc của mình. Trong khi exec không hoạt động, vì có thể thực hiện được nhiều hơn nhưng chúng tôi không cần.
  • Như đã nói Mattias Buelens, sử dụng isMail() hợp lý hơn: là một email: có hoặc không. Trong khi exec: là email: email hoặc null -> wtf? lol
+0

Ý của bạn là gì theo 'cách tốt nhất'? – j08691

+0

thứ nhất. Phụ thuộc vào những gì bạn đang cố gắng làm. Bạn có cần kết hợp/chụp nhóm và như vậy hoặc chỉ xác nhận để kiểm tra xem chuỗi cung cấp của bạn có khớp với regex không? Ngoài ra, câu hỏi thứ 2 là tùy chọn dựa trên, nó sẽ có kết quả tương tự. Bạn nên chọn cái nào dễ đọc và dễ bảo trì hơn cho bạn/nhóm của bạn. –

+0

có hai giải pháp, có sự khác biệt, vì vậy tôi nghĩ rằng một trong số đó là tốt nhất ** EDIT ** @ Fabrício Matté: chỉ xác nhận. Có, tôi nghĩ rằng cách đầu tiên là tốt nhất bởi vì logic dễ hiểu hơn. (cho bạn;)) –

Trả lời

15

Nếu bạn chỉ cần kiểm tra chuỗi đầu vào để phù hợp với cụm từ thông dụng, RegExp.test là thích hợp nhất. Nó sẽ cung cấp cho bạn một giá trị trả về boolean giúp nó trở nên lý tưởng cho các điều kiện.

RegExp.exec cung cấp cho bạn giá trị trả về giống như mảng với tất cả nhóm chụp và chỉ mục phù hợp. Vì vậy, nó rất hữu ích khi bạn cần làm việc với các nhóm hoặc chỉ mục đã chụp sau trận đấu. (Ngoài ra, it behaves a bit different so với String.match khi sử dụng công cụ sửa đổi toàn cầu /g)

Cuối cùng, nó sẽ không quan trọng nhiều về tốc độ hoặc hiệu quả. Biểu thức chính quy sẽ vẫn được đánh giá và tất cả các nhóm và chỉ mục phù hợp sẽ có sẵn thông qua đối tượng toàn cầu RegExp (mặc dù chúng tôi khuyên bạn nên sử dụng các giá trị trả về).

Đối với thử nghiệm if, đó chỉ là vấn đề về sở thích cá nhân.Việc chỉ định kết quả của phép thử biểu thức chính quy cho một biến có tên có ý nghĩa (chẳng hạn như isEmail) có thể cải thiện khả năng đọc, nhưng khác hơn là chúng đều ổn.

+3

Đó là một lời giải thích tốt, mặc dù có một số sai sót. "' RegExp.exec' cung cấp cho bạn một giá trị trả về giống như mảng với ** tất cả các nhóm chụp ** và các chỉ mục phù hợp. " Không hẳn. Nó sẽ trả về một mảng với kết quả đầu tiên trong chỉ mục '[0]' và các nhóm bắt giữ tiếp theo của nó trong các chỉ mục tiếp theo. Nó không trả về tất cả các trận đấu/nhóm chụp, chỉ là trận đấu đầu tiên với tất cả các nhóm bắt giữ của nó. Tuy nhiên, bạn lặp lại thông qua nó với ví dụ: một vòng lặp 'while' tự động lưu trữ thuộc tính' lastIndex' trong đối tượng regex, như được hiển thị trong liên kết MDN mà bạn cung cấp. –

Các vấn đề liên quan