Самый быстрый способ проверки строки содержать другую подстроку в JavaScript?

Я работаю с проблемой производительности на JavaScript. Поэтому я просто хочу спросить: какой самый быстрый способ проверить, содержит ли строка другую подстроку (мне просто нужно логическое значение)? Не могли бы вы предложить свою идею и образец кода фрагмента?

Ответ 1

У вас есть две возможности:

  1. Регулярное выражение:

    (new RegExp('word')).test(str)
    // or
    /word/.test(str)
    
  2. indexOf:

    str.indexOf('word') !== -1
    

Регулярные выражения кажутся быстрее (по крайней мере, в Chrome 10).

Тест производительности - короткий стог сена
Тест производительности - длинный стог сена


Обновление 2011:

Нельзя с уверенностью сказать, какой метод быстрее. Различия между браузерами огромны. В то время как в Chrome 10 indexOf быстрее, в Safari 5 indexOf явно медленнее, чем любой другой метод.

Вы должны увидеть и попробовать себя. Это зависит от ваших потребностей. Например, поиск без учета регистра намного быстрее с регулярными выражениями.


Обновление 2018:

Просто чтобы уберечь людей от запуска самих тестов, вот текущие результаты для большинства распространенных браузеров, проценты указывают на увеличение производительности по сравнению со следующим самым быстрым результатом (который варьируется в зависимости от браузера):

Chrome: indexOf (~ 98% быстрее) <-- wow
Firefox: кэшированный RegExp (~ 18% быстрее)
IE11: кэшированный RegExp (~ 10% быстрее)
Edge: indexOf (~ 18% быстрее)
Safari: кэшированный RegExp (~ 0,4% быстрее)

Обратите внимание, что кэшированный RegExp имеет вид: var r = new RegExp('simple'); var c = r.test(str); var r = new RegExp('simple'); var c = r.test(str); в отличие от: /simple/.test(str)

Ответ 2

Это работает для вас?

string1.indexOf(string2) >= 0

Изменить: это может быть не быстрее, чем RegExp, если строка2 содержит повторяющиеся шаблоны. В некоторых браузерах indexOf может быть намного медленнее, чем RegExp. См. Комментарии.

Изменить 2: RegExp может быть быстрее, чем indexOf, когда строки очень длинны и/или содержат повторяющиеся шаблоны. См. Комментарии и ответ @Felix.

Ответ 3

Я обнаружил, что использование простого цикла for, итерация по всем элементам в строке и сравнение с использованием charAt выполняется быстрее, чем indexOf или Regex. Код и доказательство можно найти в JSPerf.

ETA: indexOf и charAt оба действуют так же ужасно на Chrome Mobile в соответствии с данными браузера Scope, указанными на jsperf.com

Ответ 4

В ES6 метод includes() используется для определения того, может ли одна строка быть найдена в другой строке, возвращая true или false по мере необходимости.

var str = 'To be, or not to be, that is the question.';

console.log(str.includes('To be'));       // true
console.log(str.includes('question'));    // true
console.log(str.includes('nonexistent')); // false

Вот jsperf между

var ret = str.includes('one');

И

var ret = (str.indexOf('one') !== -1);

В результате, показанном в jsperf, кажется, что оба они хорошо работают.

Ответ 5

Для нахождения простой строки с использованием метода indexOf() и с использованием regex практически то же самое: http://jsperf.com/substring - выберите который легче писать.

Ответ 6

Я сделал jsben.ch для вас http://jsben.ch/#/aWxtF... кажется, что indexOf немного быстрее.

Ответ 7

Это простой способ использовать метод .match() для строки.

var re = /(AND|OR|MAYBE)/;
var str = "IT MAYBE BETTER WAY TO USE .MATCH() METHOD TO STRING";
console.log('Do we found something?', Boolean(str.match(re)));

Желаю вам приятного дня, сэр!

Ответ 8

Самый быстрый

  1. (ES6) включает в себя
    var string = "hello",
    substring = "lo";
    string.includes(substring);
  1. ES5 и старше indexOf
    var string = "hello",
    substring = "lo";
    string.indexOf(substring) !== -1;

http://jsben.ch/9cwLJ

enter image description here