của nó vì g
cờ. Nó bắt đầu ghi nhớ chỉ mục cuối cùng của trận đấu và khi bạn làm r.test
lần sau, nó bắt đầu từ chỉ mục đó. Đó là lý do tại sao nó thay đổi giữa true
và false
. Hãy thử
var r = /e/gi;
console.log(r.test('e'));
# true
console.log(r.lastIndex);
# 1
console.log(r.test('e'));
# false
console.log(r.lastIndex);
# 0
console.log(r.test('e'));
# true
console.log(r.lastIndex);
# 1
console.log(r.test('e'));
# false
Trích dẫn tài liệu MDN này trên RegExp.lastIndex
,
Các lastIndex
là một đọc/ghi bất động sản số nguyên của biểu thức thông thường mà quy định các chỉ số mà tại đó để bắt đầu trận tới. ...
Thuộc tính này chỉ được đặt nếu cụm từ thông dụng sử dụng cờ "g" để biểu thị tìm kiếm toàn cầu. Các quy tắc sau được áp dụng:
- Nếu
lastIndex
lớn hơn độ dài của chuỗi, test()
và exec()
thất bại, sau đó lastIndex
được thiết lập để 0.
- Nếu
lastIndex
là tương đương với chiều dài của chuỗi và nếu cụm từ thông dụng khớp với chuỗi trống, sau đó cụm từ thông dụng khớp với đầu vào bắt đầu từ lastIndex
.
- Nếu
lastIndex
là tương đương với chiều dài của chuỗi và nếu biểu thức chính quy không phù hợp với chuỗi rỗng, sau đó các sai lệch biểu thức chính quy đầu vào, và lastIndex
được reset về 0.
- Nếu không,
lastIndex
được thiết lập để vị trí tiếp theo sau trận đấu gần đây nhất.
Chữ đậm phía trên trả lời hành vi bạn đã quan sát. Sau trận đấu đầu tiên, e
, lastIndex
được đặt thành 1
, để cho biết chỉ mục mà từ đó trận đấu tiếp theo sẽ được thử. Theo điểm thứ 3 được thấy ở trên, vì số lastIndex
bằng với độ dài của chuỗi và cụm từ thông dụng không khớp với chuỗi trống, nó trả về false
và đặt lại lastIndex
thành 0.