¿Cuál es la diferencia entre indexOf () y search ()?

180

Siendo bastante nuevo en JavaScript, no puedo discernir cuándo usar cada uno de estos.

¿Alguien puede ayudar a aclarar esto para mí?

Colin Brock
fuente

Respuestas:

211

Si necesita una expresión regular, use search(). De lo contrario, indexOf()va a ser más rápido.

ng.mangine
fuente
32
alguna referencia para apoyar este reclamo?
robisrob
16
Además, searchevaluará una cadena en una expresión regular, incluso si no lo desea.
cregox
26
El comentario de @ cregox es importante: intente "hello.".search("."), devuelve 0, no 5 porque .es el token regex para "cualquier personaje"
14

La función de búsqueda ( una descripción aquí ) toma una expresión regular, que le permite comparar con patrones más sofisticados, cadenas que no distinguen entre mayúsculas y minúsculas, etc., mientras que indexOf ( una descripción aquí ) simplemente coincide con una cadena literal. Sin embargo, indexOf también le permite especificar un índice inicial.

joel.neely
fuente
7

Creo que la principal diferencia es que la búsqueda acepta expresiones regulares.

Verifique esta referencia:

CMS
fuente
4

IndexOf (): acepta literales de cadena u objetos de cadena pero no expresiones regulares. También acepta un valor entero basado en cero para comenzar su búsqueda, por ejemplo:

  1. "babyelephant" .indexOf ("e"); // te da 4
  2. "babyelephant" .indexOf ("e", 5); // te da 6 cuando la búsqueda comienza desde la 6ta posición o el 5to índice.
  3. var m = / e /; "babyelephant" .indexOf (m); // da -1 ya que no acepta expresiones regulares.

Search (): acepta tanto literales de cadena como objetos de cadena y expresiones regulares. Pero no acepta un índice para comenzar la búsqueda.

bablue
fuente
¿Para qué vuelve "baby/e/lephant".indexOf(m);?
RamenChef
1
bueno ... devolverá 4 ... porque / e / string está presente ... pero si desea encontrar una expresión regular "e" no obtendrá el resultado deseado. UMM tal vez debería modificar mi respuesta a indexOf () intenta encontrar la expresión regular como un literal de cadena y no como una expresión regular.
bablue
4

indexOf () y search ()

  • común en ambos

    i) devuelve la primera aparición del valor buscado

    ii) devuelve -1 si no se encuentra coincidencia

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

  • especial en indexOf ()

    i) puede dar la posición de búsqueda inicial como segundo argumento

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

  • especial en search ()

el valor de búsqueda puede ser una expresión regular

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

referencia

K23raj
fuente
-1

Sin una expresión regular , no hay diferencia práctica entre indexOf y search .

El siguiente ejemplo ofrece una demostración en vivo :

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
fuente
1
Hay una diferencia significativa: searchconvierte una cadena en un RegExp, por ejemplo, str.search("d........e");también coincidirá con el carácter 39.
1j01