2009-10-07 38 views
5

Tôi biết có một vài sự khác biệt về regex/lastIndex nhưng điều này là mới đối với tôi!Regex/lastIndex - Hành vi bất ngờ

Dự kiến ​​hành vi: Tạo một biểu thức chính quy mới (với nghĩa đen/constructor) sẽ, rõ ràng, tạo ra một đối tượng RegExp mới với một tài sản thiết lập để không lastIndex.

Hành vi thực tế: (trong FF, Chrome): Thuộc tính lastIndex dường như tồn tại qua nhiều sáng tạo RegExp.

Ví dụ:

function foo(s) { 

    // A *NEW* regular expression 
    // is created on each call of foo(): 
    var regex = /ABC/g; 

    document.write(regex.lastIndex + '<br/>'); 

    // regex.test() updates lastIndex property 
    regex.test(s); 

    // This is where the regex's life should end... 
    // (Why does it persist?) 

} 

foo('ABC'); 
foo('ABCABC'); 
foo('ABCABCABC'); 

Xem ở đây: http://jsbin.com/otoze


Một đối tượng RegExp mới đang được tạo ra trên mỗi cuộc gọi chức năng (phải không?), Vậy tại sao là sau đây được ghi vào tài liệu ?? -

0 
3 
6 

???

Lưu ý, sự kỳ quặc này dường như xảy ra trong FF (3) và Chrome (2), nhưng, tò mò không phải là IE.

Đây có phải là hành vi được mong đợi không, IE có làm sai hoặc đúng không? Đây có phải là lỗi nổi tiếng không?


EDIT: điều này dường như không xảy ra khi khởi tạo regex bằng hàm tạo thay vì chữ. Ví dụ. new RegExp('ABC','g'); ... Tuy nhiên, tác phẩm theo nghĩa đen (về mặt lý thuyết) phải không?

Trả lời

5

var regex = new RegExp("ABC", "g"); không có vấn đề đó, vì vậy tôi đoán /ABC/g tái sử dụng các đối tượng regexp.

EDIT: Rõ ràng đây là hành vi đúng theo đặc tả ECMAScript 3.0, nó cố định trong ECMAScript 3,1-details

+0

Đó là tôi đoán quá ... Vẫn lẻ ... – James

+0

@JP: Nó không thực sự kỳ quặc, bạn không bao giờ sử dụng từ khóa 'mới'. – Chris

+0

Điều lạ lùng là nếu bạn gọi cùng một mã trong hàm nhiều lần, nó sẽ trả về kết quả chính xác. Nó gần như có vẻ như nó tối ưu hóa không chính xác ra một số bài tập trong các cuộc gọi sau này của cùng một chức năng. –

1

Hãy thử điều này:

function foo(s) { 

    // A *NEW* regular expression 
    // is created on each call of foo(): 
    var regex = new RegEx("ABC", "g"); 

    document.write(regex.lastIndex + '<br/>'); 

    // regex.test() updates lastIndex property 
    regex.test(s); 

    // This is where the regex's life should end... 
    // (Why does it persist?) 

} 

foo('ABC'); 
foo('ABCABC'); 
foo('ABCABCABC'); 
Các vấn đề liên quan