Was ist der Unterschied zwischen indexOf () und search ()?


180

Da ich in JavaScript ziemlich neu bin, kann ich nicht erkennen, wann ich diese verwenden soll.

Kann mir jemand helfen, das zu klären?

Antworten:


211

Wenn Sie einen regulären Ausdruck benötigen, verwenden Sie search(). Sonst indexOf()geht es schneller.


31
Gibt es einen Hinweis, der diese Behauptung stützt?
Robisrob

16
Außerdem searchwird eine Zeichenfolge in einen regulären Ausdruck ausgewertet, auch wenn Sie dies nicht möchten.
Cregox

26
@ cregox Kommentar ist wichtig - versuchen Sie "hello.".search(".")- es gibt 0 zurück, nicht 5, weil .das Regex-Token für "jedes Zeichen" ist


14

Die Suchfunktion ( eine Beschreibung hier ) verwendet einen regulären Ausdruck, mit dem Sie mit komplexeren Mustern, Zeichenfolgen ohne Berücksichtigung der Groß- und Kleinschreibung usw. übereinstimmen können, während indexOf ( eine Beschreibung hier ) einfach mit einer Literalzeichenfolge übereinstimmt. Mit indexOf können Sie jedoch auch einen Anfangsindex angeben.


7

Ich denke, der Hauptunterschied besteht darin, dass die Suche reguläre Ausdrücke akzeptiert.

Überprüfen Sie diese Referenz:


4

IndexOf () - akzeptiert Zeichenfolgenliterale oder Zeichenfolgenobjekte, jedoch keine regulären Ausdrücke. Es akzeptiert auch einen auf Null basierenden ganzzahligen Wert, von dem aus die Suche gestartet werden soll, z.

  1. "babyelephant" .indexOf ("e"); // gibt dir 4
  2. "Babyelephant" .indexOf ("e", 5); // gibt Ihnen 6, wenn die Suche von der 6. Position oder dem 5. Index beginnt.
  3. var m = / e /; "Babyelephant" .indexOf (m); // gibt -1, da es keine regulären Ausdrücke akzeptiert.

Search () - akzeptiert sowohl String-Literale oder String-Objekte als auch reguläre Ausdrücke. Es wird jedoch kein Index akzeptiert, von dem aus die Suche gestartet werden kann.


Wofür kehrt es zurück "baby/e/lephant".indexOf(m);?
RamenChef

1
gut eins .. es wird 4 zurückgeben .. weil / e / string vorhanden ist .. aber wenn Sie einen regulären Ausdruck "e" finden möchten, werden Sie nicht das gewünschte Ergebnis erhalten. UMM Vielleicht sollte ich meine Antwort ändern, damit indexOf () versucht, den regulären Ausdruck als Zeichenfolgenliteral und nicht als regulären Ausdruck zu finden.
Bablue

4

indexOf () und search ()

  • gemeinsam in beiden

    i) das erste Auftreten des gesuchten Werts zurückgeben

    ii) Rückgabe -1, wenn keine Übereinstimmung gefunden wurde

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

  • speziell in indexOf ()

    i) Sie können die Startsuchposition als zweites Argument angeben

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

  • speziell in der Suche ()

Der Suchwert kann ein regulärer Ausdruck sein

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

Referenz



-1

Ohne Regex gibt es keinen praktischen Unterschied zwischen indexOf und search .

Das folgende Beispiel zeigt eine Live- Demo :

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
Es gibt einen signifikanten Unterschied: searchKonvertiert eine Zeichenfolge in eine RegExp, so dass sie beispielsweise str.search("d........e");auch mit Zeichen 39
übereinstimmt
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.