.indexOf()
và .includes()
các phương thức có thể được sử dụng để tìm kiếm một phần tử trong một mảng hoặc để tìm kiếm một ký tự / chuỗi con trong một chuỗi đã cho.
Sử dụng trong mảng
( Liên kết đến Đặc tả ECMAScript)
indexOf
sử dụng So sánh bình đẳng nghiêm ngặt trong khi includes
sử dụng thuật toán SameValueZero . Bởi vì lý do này, hai điểm khác biệt sau đây phát sinh.
Như đã chỉ ra bởi Felix Kling , hành vi là khác nhau trong trường hợp NaN
.
let arr = [NaN];
arr.indexOf(NaN); // returns -1; meaning NaN is not present
arr.includes(NaN); // returns true
- Các hành vi cũng khác nhau trong trường hợp
undefined
.
let arr = [ , , ];
arr.indexOf(undefined); // returns -1; meaning undefined is not present
arr.includes(undefined); // returns true
Sử dụng trong chuỗi
( Liên kết đến Đặc tả ECMAScript)
- Nếu bạn chuyển một RegExp tới
indexOf
, nó sẽ coi RegExp là một chuỗi và sẽ trả về chỉ mục của chuỗi, nếu được tìm thấy. Tuy nhiên, nếu bạn chuyển một RegExp tới includes
, nó sẽ đưa ra một ngoại lệ.
let str = "javascript";
str.indexOf(/\w/); // returns -1 even though the elements match the regex because /\w/ is treated as string
str.includes(/\w/); // throws TypeError: First argument to String.prototype.includes must not be a regular expression
Hiệu suất
Như 538ROMEO đã chỉ ra, includes
có thể chậm hơn một chút (rất nhỏ) một chút (vì nó cần kiểm tra regex làm đối số đầu tiên) so với indexOf
nhưng trên thực tế, điều này không tạo ra nhiều khác biệt và không đáng kể.
Lịch sử
String.prototype.includes()
đã được giới thiệu trong ECMAScript 2015 trong khi Array.prototype.includes()
được giới thiệu trong ECMAScript 2016. Liên quan đến hỗ trợ trình duyệt, hãy sử dụng chúng một cách khôn ngoan.
String.prototype.indexOf()
và Array.prototype.indexOf()
có mặt trong phiên bản ES5 của ECMAScript và do đó được hỗ trợ bởi tất cả các trình duyệt.
includes
có hỗ trợ trình duyệt kém hơn nhiều.