Quelle est la différence entre indexOf () et search ()?

180

Étant assez nouveau dans JavaScript, je suis incapable de discerner quand utiliser chacun d'eux.

Quelqu'un peut-il m'aider à clarifier cela pour moi?

Colin Brock
la source

Réponses:

211

Si vous avez besoin d'une expression régulière, utilisez search(). Sinon, ça indexOf()va être plus rapide.

ng.mangine
la source
32
une référence à l'appui de cette affirmation?
robisrob
16
Également, searchévaluera une chaîne dans une regex même si vous ne le souhaitez pas.
cregox
26
Le commentaire de @ cregox est important - essayez "hello.".search(".")- il renvoie 0, pas 5 parce que .c'est le jeton regex pour "n'importe quel caractère"
34

indexOfest pour les sous-chaînes simples, searchest pour les expressions régulières.

Greg
la source
14

La fonction de recherche ( une description ici ) prend une expression régulière, qui vous permet de faire une correspondance avec des modèles plus sophistiqués, des chaînes insensibles à la casse, etc., tandis que indexOf ( une description ici ) correspond simplement à une chaîne littérale. Cependant, indexOf vous permet également de spécifier un index de début.

joel.neely
la source
7

Je pense que la principale différence est que la recherche accepte les expressions régulières.

Vérifiez cette référence:

CMS
la source
4

IndexOf () - il accepte les chaînes littérales ou les objets chaîne mais pas les expressions régulières. Il accepte également une valeur entière de base zéro pour démarrer sa recherche, par exemple:

  1. "babyelephant" .indexOf ("e"); // vous donne 4
  2. "babyelephant" .indexOf ("e", 5); // vous donne 6 lorsque la recherche commence à partir de la 6ème position ou du 5ème index.
  3. var m = / e /; "babyelephant" .indexOf (m); // donne -1 car il n'accepte pas les expressions régulières.

Search () - accepte à la fois les chaînes littérales ou les objets chaîne et les expressions régulières. Mais il n'accepte pas d'index pour démarrer la recherche.

bablue
la source
Qu'est-ce que ça rapporte "baby/e/lephant".indexOf(m);?
RamenChef
1
bon .. il retournera 4..parce que / e / string est présent..mais si vous voulez trouver une regex "e" vous n'obtiendrez pas le résultat souhaité. UMM peut-être que je devrais modifier ma réponse à indexOf () essaie de trouver l'expression régulière comme une chaîne littérale et non comme une expression régulière.
bablue le
4

indexOf () et search ()

  • commun aux deux

    i) renvoie la première occurrence de la valeur recherchée

    ii) renvoie -1 si aucune correspondance n'est trouvée

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

  • spécial dans indexOf ()

    i) vous pouvez donner la position de recherche de départ comme deuxième argument

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

  • spécial dans la recherche ()

la valeur de recherche peut être une expression régulière

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

référence

K23raj
la source
-1

Sans regex , il n'y a pas de différence pratique entre indexOf et search .

L'exemple ci-dessous donne une démo en direct :

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>

Zameer
la source
1
Il y a une différence significative: searchconvertit une chaîne en a RegExp, par exemple, str.search("d........e");correspondra également au caractère 39.
1j01