В чем разница между indexOf () и search ()?

180

Будучи довольно новым для JavaScript, я не могу понять, когда использовать каждый из них.

Кто-нибудь может помочь уточнить это для меня?

Колин Брок
источник

Ответы:

211

Если вам требуется регулярное выражение, используйте search(). В противном случае indexOf()будет быстрее.

ng.mangine
источник
32
Любая ссылка в поддержку этого требования?
Робисроб
16
Кроме того, searchоценит строку в регулярное выражение, даже если вы не хотите.
cregox
26
Комментарий @ cregox важен - попробуйте "hello.".search(".")- он возвращает 0, а не 5, потому что .это токен регулярного выражения для «любого символа»
14

Функция поиска ( одно описание здесь ) принимает регулярное выражение, которое позволяет вам сравнивать с более сложными шаблонами, нечувствительными к регистру строками и т. Д., В то время как indexOf ( одно описание здесь ) просто совпадает с литеральной строкой. Однако indexOf также позволяет указывать начальный индекс.

joel.neely
источник
7

Я думаю, что главное отличие состоит в том, что поиск принимает регулярные выражения.

Проверьте эту ссылку:

CMS
источник
4

IndexOf () - он принимает строковые литералы или строковые объекты, но не регулярные выражения. Он также принимает целочисленное значение, начинающееся с нуля, с которого начинается поиск, например:

  1. "Babyelephant" .indexOf ( "е"); // дает вам 4
  2. "Babyelephant" .indexOf ( "е", 5); // дает вам 6, поскольку поиск начинается с 6-й позиции или 5-го индекса.
  3. var m = / e /; "Babyelephant" .indexOf (м); // дает -1, поскольку не принимает регулярные выражения.

Search () - принимает как строковые литералы или строковые объекты, так и регулярные выражения. Но он не принимает индекс, с которого начинается поиск.

bablue
источник
За что это возвращает "baby/e/lephant".indexOf(m);?
RamenChef
1
хороший ... он вернет 4..потому что / e / string присутствует..но если вы хотите найти регулярное выражение "e", вы не получите желаемый результат. UMM, возможно, я должен изменить свой ответ на indexOf () пытается найти регулярное выражение как строковый литерал, а не как регулярное выражение.
Bablue
4

indexOf () и search ()

  • общий в обоих

    я) вернуть первое вхождение искомого значения

    ii) вернуть -1, если совпадений не найдено

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

  • специальный в indexOf ()

    я) вы можете дать начальную позицию поиска в качестве второго аргумента

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

  • спец в поиске ()

значение поиска может быть регулярным выражением

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

ссылка

K23raj
источник
-1

Без регулярного выражения нет никакой практической разницы между indexOf и поиском .

Пример ниже дает живую демонстрацию :

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
источник
1
Существует существенная разница: searchпреобразует строку в a RegExp, поэтому, например, str.search("d........e");также будет соответствовать символу 39.
1j01