Bạn có nên sử dụng đối tượng RegExp hoặc kiểu nội tuyến không? Và tại sao?Biểu thức chính quy JavaScript nội dòng có nhanh hơn không?
Trả lời
Theo đặc tả ES3, họ là hơi khác nhau ở chỗ cú pháp chữ (/regex/
) sẽ tạo ra một đối tượng RegExp
đơn khi quá trình quét ban đầu:
Một biểu thức chính quy theo nghĩa đen là một yếu tố đầu vào được chuyển thành đối tượng RegExp (phần 15.10) khi quét . Đối tượng được tạo trước khi đánh giá chương trình hoặc chức năng có chứa bắt đầu. Đánh giá của nghĩa đen tạo ra một tham chiếu đến đối tượng đó; nó không tạo đối tượng mới.
Các lỗi trong spec đã được thừa nhận trong ES4:
Trong ES3 một biểu thức chính quy theo nghĩa đen như/ab/mg biểu thị một đối tượng RegExp độc đáo duy nhất được tạo ra lần đầu tiên các literal gặp phải trong quá trình đánh giá. Trong ES4, đối tượng RegExp RegExp mới được tạo mỗi lần đánh giá bằng chữ trong khi đánh giá .
Triển khai khác nhau giữa các trình duyệt. Safari và IE xử lý các chữ theo ES4, nhưng Firefox và Chrome xuất hiện để xử lý chúng theo ES3.
Hãy thử đoạn mã sau trong các trình duyệt khác nhau và bạn sẽ thấy những gì tôi có nghĩa là:
function f() {
return /abc/g.test('abc');
}
alert(f()); // Alerts true
alert(f()); // Alerts false in FF/Chrome
So với:
function f() {
return RegExp('abc', 'g').test('abc');
}
alert(f()); // Alerts true
alert(f()); // Alerts true
Note, giả được cảnh báo bởi vì chức năng vẫn sử dụng regex từ cuộc gọi trước đó của hàm đó, số lastIndex
đã được cập nhật, có nghĩa là nó sẽ không khớp với chuỗi "abc"
nữa.
Mẹo: nhà cung cấp new
không được yêu cầu cho RegExp
để được khởi tạo. RegExp()
bởi chính nó hoạt động giống ...
Thông tin thêm về/4 vấn đề ES3: Regex/lastIndex - Unexpected behaviour
Theo J-P's answer có là một sự khác biệt nhỏ, đôi khi có thể quan trọng. Các ý định là:
var re = /\d+/;
được giống như:
var re = new RegExp("\\d+");
nhưng, kỳ quặc, trong Firefox/Chrome nó không phải là khá như nhau (như chứng minh bằng ví dụ của mình với các biểu thức trạng thái được sử dụng nhiều lần).
Vì vậy, hãy sử dụng đối tượng RegExp
sẽ là lời khuyên của tôi. Và một tìm kiếm tuyệt vời của J-P.
Điều đó đang được nói, bối cảnh chính nơi bạn phải sử dụng RegExp
so với cú pháp theo nghĩa đen nào là để tự động tạo ra các biểu thức, ví dụ:
var s = "[asdf]+";
var re = new RegExp(":" + s + ":", "g");
Có phải là người ngồi khác biệt rõ hơn. Động lực của tôi cho việc đặt câu hỏi này là bởi vì JSLint dường như không thích định dạng nội tuyến. Thật không may tôi không thể tìm thấy một lý do dễ hiểu là tại sao. –
JSLint không thích nhiều thứ hầu như giống hệt nhau. Hãy nhớ rằng JSLint là một bộ kiểm tra * style *, không chỉ là một trình kiểm tra cú pháp. Nó rất có thể cau mày bởi ông Crockford bởi vì nó có thể khó hiểu hoặc một cái gì đó tương tự. – nickf
"The RegExp() phương pháp cho phép bạn tự động xây dựng mẫu tìm kiếm dưới dạng chuỗi và hữu ích khi mẫu không được biết trước. " - http://www.javascriptkit.com/jsref/regexp.shtml
- 1. Tạo chức năng clr biểu thức chính quy nhanh hơn
- 2. Biểu thức chính quy JavaScript
- 3. Có sử dụng Biểu thức chính quy nhanh hơn IndexOf không?
- 4. biểu thức chính quy lookbehind javascript
- 5. Tạo mảng biểu thức chính quy Javascript
- 6. Biểu thức chính quy Javascript Xóa không gian
- 7. Biểu thức chính quy Javascript "Ký tự không gian đơn"
- 8. Một biểu thức chính quy nhanh chóng cần thiết
- 9. Biểu thức chính quy Đối sánh biến nhiều dòng?
- 10. Không thể nhận biểu thức chính quy hoạt động chính xác với nhiều dòng
- 11. trận đấu trên nhiều dòng perl biểu thức chính quy
- 12. Biểu thức chính quy nhiều dòng trong C#
- 13. Có biểu thức chính quy JavaScript nào để xóa tất cả khoảng trắng ngoại trừ dòng mới không?
- 14. Biểu thức chính quy không tuân thủ
- 15. javascript biểu thức chính quy làm chức năng?
- 16. Biểu thức chính quy Javascript - chuỗi để đối tượng RegEx
- 17. Biểu thức chính quy Javascript nhiều đối sánh
- 18. Biểu thức chính quy javascript đơn giản cho số dải
- 19. Biểu thức chính quy Javascript khớp với hai chuỗi
- 20. Biểu thức chính quy Javascript - vòng lặp vô hạn exec
- 21. Biểu thức chính quy Javascript cho giá trị rgb
- 22. Biểu thức chính quy Javascript để xác thực URL
- 23. có cần một cách khai báo biểu thức chính quy hơn không? :)
- 24. Tại sao không có tiêu chuẩn biểu thức chính quy?
- 25. biểu thức chính quy không có ký tự
- 26. Giao thức uwsgi có nhanh hơn giao thức http không?
- 27. Tại sao không có $ trong biểu thức chính quy nhiều dòng. NET khớp với CRLF?
- 28. HTML 5 - biểu thức chính quy số
- 29. Biểu thức chính quy - Ruby vs Perl
- 30. Cách tách quy tắc biểu thức chính quy dài thành nhiều dòng trong Python
Đó là điều thú vị, con người. Đó là điều thú vị. –
Vì vậy, bạn có thể tranh luận rằng việc sử dụng biểu mẫu nội tuyến sẽ hiệu quả hơn một chút (ít nhất là trong ES3). Trong khi biểu mẫu RegExp sẽ tạo ra kết quả thực thi chéo nhất quán hơn. Tuyệt vời! –
+1 tìm/trả lời tốt – cletus