Jaka jest różnica między indexOf () a search ()?

180

Jako że jestem całkiem nowy w JavaScript, nie jestem w stanie określić, kiedy użyć każdego z nich.

Czy ktoś może mi to wyjaśnić?

Colin Brock
źródło

Odpowiedzi:

211

Jeśli potrzebujesz wyrażenia regularnego, użyj search(). W przeciwnym razie indexOf()będzie szybciej.

ng.mangine
źródło
32
jakieś odniesienia na poparcie tego roszczenia?
robisrob
16
Również searchoceni ciąg znaków do wyrażenia regularnego, nawet jeśli nie chcesz.
cregox 13.07.16
26
Komentarz @ cregox jest ważny - spróbuj "hello.".search(".")- zwraca 0, a nie 5, ponieważ .jest to token wyrażenia regularnego dla „dowolnej postaci”
34

indexOfjest dla zwykłych podciągów, searchjest dla wyrażeń regularnych.

Greg
źródło
14

Funkcja wyszukiwania ( tutaj jeden opis ) przyjmuje wyrażenie regularne, które pozwala dopasowywać bardziej wyrafinowane wzorce, ciągi znaków bez rozróżniania wielkości liter itp., Podczas gdy indexOf ( jeden opis tutaj ) po prostu dopasowuje ciąg literału. Jednak indexOf pozwala również określić indeks początkowy.

joel.neely
źródło
7

Myślę, że główna różnica polega na tym, że wyszukiwanie akceptuje wyrażenia regularne.

Sprawdź to odniesienie:

CMS
źródło
4

IndexOf () - przyjmuje literały łańcuchowe lub obiekty łańcuchowe, ale nie wyrażenia regularne. Akceptuje również zerową wartość całkowitą, aby rozpocząć wyszukiwanie, np .:

  1. „babyelephant” .indexOf („e”); // daje ci 4
  2. „babyelephant” .indexOf („e”, 5); // daje ci 6, ponieważ wyszukiwanie zaczyna się od 6. pozycji lub 5. indeksu.
  3. var m = / e /; „babyelephant” .indexOf (m); // daje -1, ponieważ nie akceptuje wyrażeń regularnych.

Search () - akceptuje zarówno literały łańcuchowe, jak i obiekty łańcuchowe i wyrażenia regularne. Ale nie akceptuje indeksu, od którego można rozpocząć wyszukiwanie.

bablue
źródło
Po co wraca "baby/e/lephant".indexOf(m);?
RamenChef,
1
dobry .. zwróci 4..ponieważ / e / string jest obecny .. ale jeśli chcesz znaleźć wyrażenie regularne „e”, nie uzyskasz pożądanego rezultatu. UMM może powinienem zmodyfikować moją odpowiedź, aby indexOf () próbował znaleźć regex jako literał ciąg, a nie jako regex.
bablue
4

indexOf () i search ()

  • powszechne w obu

    i) zwraca pierwsze wystąpienie szukanej wartości

    ii) zwraca -1, jeśli nie znaleziono dopasowania

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

  • special in indexOf ()

    i) możesz podać początkową pozycję wyszukiwania jako drugi argument

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

  • specjalne w wyszukiwaniu ()

szukana wartość może być wyrażeniem regularnym

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

odniesienie

K23raj
źródło
-1

Bez wyrażenia regularnego nie ma praktycznej różnicy między indexOf a wyszukiwaniem .

Poniższy przykład przedstawia demo na żywo :

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>

Mohammed Zameer
źródło
1
Istnieje znacząca różnica: searchkonwertuje ciąg znaków na RegExp, więc na przykład str.search("d........e");będzie również pasował do znaku 39.
1j01