Qual é a diferença entre indexOf () e search ()?

180

Sendo relativamente novo no JavaScript, não consigo discernir quando usar cada um deles.

Alguém pode ajudar a esclarecer isso para mim?

Colin Brock
fonte

Respostas:

211

Se você precisar de uma expressão regular, use search(). Caso contrário, indexOf()será mais rápido.

ng.mangine
fonte
32
alguma referência para apoiar esta reivindicação?
robisrob
16
Além disso, searchavaliará uma string em uma regex, mesmo que você não queira.
22416 cregox
26
@ comentário de cregox é importante - tentativa "hello.".search(".")- ele retorna 0, não 5, porque .é o regex token para "qualquer caractere"
34

indexOfé para substrings simples, searché para expressões regulares.

Greg
fonte
14

A função de pesquisa ( uma descrição aqui ) usa uma expressão regular, que permite comparar com padrões mais sofisticados, seqüências que não diferenciam maiúsculas de minúsculas etc., enquanto indexOf ( uma descrição aqui ) simplesmente corresponde a uma sequência literal. No entanto, indexOf também permite especificar um índice inicial.

joel.neely
fonte
7

Eu acho que a principal diferença é que a pesquisa aceita expressões regulares.

Verifique esta referência:

CMS
fonte
4

IndexOf () - aceita literais de string ou objetos de string, mas não expressões regulares. Ele também aceita um valor inteiro baseado em zero para iniciar sua pesquisa, por exemplo:

  1. "babyelephant" .indexOf ("e"); // te dá 4
  2. "babyelephant" .indexOf ("e", 5); // fornece 6 quando a pesquisa começa na 6ª posição ou no 5º índice.
  3. var m = / e /; "babyelephant" .indexDe (m); // fornece -1, pois não aceita expressões regulares.

Search () - aceita literais de string ou objetos de string e expressões regulares. Mas ele não aceita um índice para iniciar a pesquisa.

bablue
fonte
Para que ele retorna "baby/e/lephant".indexOf(m);?
RamenChef
1
bom .. ele retornará 4 .. porque / e / string está presente .. mas se você quiser encontrar um regex "e", não obterá o resultado desejado. UMM, talvez eu deva modificar minha resposta para indexOf () tenta encontrar o regex como uma string literal e não como um regex.
bablue 5/09/16
4

indexOf () e search ()

  • comum em ambos

    i) retorna a primeira ocorrência do valor pesquisado

    ii) retorne -1 se nenhuma correspondência for encontrada

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

  • especial em indexOf ()

    i) você pode indicar a posição inicial da pesquisa como um segundo argumento

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

  • especial em pesquisa ()

valor da pesquisa pode ser expressão regular

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

referência

K23raj
fonte
-1

Sem uma regex , não há diferença prática entre indexOf e pesquisa .

O exemplo abaixo fornece uma demonstração ao 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
fonte
1
Há uma diferença significativa: searchconverte uma string em um RegExp, por exemplo, str.search("d........e");também corresponderá no caractere 39.
1j01 21/01/19