Sự khác biệt giữa indexOf () và search () là gì?


180

Là khá mới đối với JavaScript, tôi không thể nhận ra khi nào nên sử dụng từng loại này.

Bất cứ ai có thể giúp làm rõ điều này cho tôi?

Câu trả lời:


211

Nếu bạn yêu cầu một biểu thức chính quy, sử dụng search(). Nếu không, indexOf()sẽ nhanh hơn.


32
bất kỳ tài liệu tham khảo để hỗ trợ yêu cầu này?
cướp

16
Ngoài ra, searchsẽ đánh giá một chuỗi thành regex ngay cả khi bạn không muốn.
cregox

26
Nhận xét của @ cregox rất quan trọng - hãy thử "hello.".search(".")- nó trả về 0, không phải 5 vì .là mã thông báo regex cho "bất kỳ ký tự nào"


14

Hàm tìm kiếm ( một mô tả ở đây ) có một biểu thức chính quy, cho phép bạn khớp với các patters phức tạp hơn, các chuỗi không phân biệt chữ hoa chữ thường, v.v., trong khi indexOf ( một mô tả ở đây ) chỉ khớp với một chuỗi ký tự. Tuy nhiên, indexOf cũng cho phép bạn chỉ định một chỉ mục bắt đầu.


7

Tôi nghĩ rằng sự khác biệt chính là tìm kiếm chấp nhận các biểu thức thông thường.

Kiểm tra tài liệu tham khảo này:


4

IndexOf () - nó chấp nhận chuỗi ký tự hoặc các đối tượng chuỗi nhưng không phải là biểu thức chính quy. Nó cũng chấp nhận giá trị nguyên dựa trên số 0 để bắt đầu tìm kiếm từ đó, ví dụ:

  1. "Em bé" .indexOf ("e"); // cung cấp cho bạn 4
  2. "cháu bé" .indexOf ("e", 5); // cung cấp cho bạn 6 khi tìm kiếm bắt đầu từ vị trí thứ 6 hoặc chỉ số thứ 5.
  3. var m = / e /; "cháu bé" .indexOf (m); // cho -1 vì nó không chấp nhận các biểu thức chính quy.

Tìm kiếm () - chấp nhận cả chuỗi ký tự hoặc đối tượng chuỗi và biểu thức chính quy. Nhưng nó không chấp nhận một chỉ mục để bắt đầu tìm kiếm từ đó.


Nó trở về để làm "baby/e/lephant".indexOf(m);gì?
RamenChef

1
tốt một .. nó sẽ trả về 4..bởi vì / e / chuỗi có mặt..nhưng nếu bạn muốn tìm một biểu thức chính quy "e" bạn sẽ không nhận được kết quả mong muốn. UMM có lẽ tôi nên sửa đổi câu trả lời của mình thành indexOf () cố gắng tìm regex dưới dạng chuỗi ký tự chứ không phải là regex.
bablue

4

indexOf () và tìm kiếm ()

  • chung ở cả hai

    i) trả lại lần xuất hiện đầu tiên của giá trị tìm kiếm

    ii) trả về -1 nếu không tìm thấy kết quả khớp

    let str='Book is booked for delivery'
    str.indexOf('b')   // returns position 8
    str.search('b')    // returns position 8 

  • đặc biệt trong indexOf ()

    i) bạn có thể đưa ra vị trí tìm kiếm bắt đầu như một đối số thứ hai

    str.indexOf('k')   // 3
    str.indexOf('k',4) // 11 (it start search from 4th position) 

  • đặc biệt trong tìm kiếm ()

giá trị tìm kiếm có thể là biểu thức chính quy

str.search('book') // 8
str.search(/book/i)  // 0   ( /i =case-insensitive   (Book == book)

tài liệu tham khảo



-1

Không có regex , không có sự khác biệt thực tế giữa indexOftìm kiếm .

Ví dụ dưới đây cho một bản demo trực tiếp :

function FromSearch() {

  var str = document.getElementById("demo").innerText;
  var n = str.search("difference");
  document.getElementById("Location").innerHTML = n;
}

function FromindexOf() {
  var str = document.getElementById("demo").innerText;
  var n = str.indexOf("difference");
  document.getElementById("Location").innerHTML = n;
}
<p id="demo">Without a <a href='http://www.w3schools.com/js/js_regexp.asp'>regex</a>, there is no practical difference between <a href='http://www.w3schools.com/jsref/jsref_indexof.asp'>indexOf</a> and <a href='http://www.w3schools.com/jsref/jsref_search.asp'>search</a>
</p>

<button onclick="FromSearch()">From search</button>

<button onclick="FromindexOf()">From indexOf</button>

<p>Location of difference in the above sentence is:</p>

<mark id="Location"></mark>


1
Có một sự khác biệt đáng kể: searchchuyển đổi một chuỗi thành một RegExp, ví dụ, str.search("d........e");cũng sẽ khớp với ký tự 39.
1j01
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.