Я работаю с проблемой производительности на JavaScript. Поэтому я просто хочу спросить: какой самый быстрый способ проверить, содержит ли строка другую подстроку (мне просто нужно логическое значение)? Не могли бы вы предложить свою идею и образец кода фрагмента?
Самый быстрый способ проверки строки содержать другую подстроку в JavaScript?
Ответ 1
У вас есть две возможности:
-
(new RegExp('word')).test(str) // or /word/.test(str)
-
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
Самый быстрый
- (ES6) включает в себя
var string = "hello", substring = "lo"; string.includes(substring);
- ES5 и старше indexOf
var string = "hello", substring = "lo"; string.indexOf(substring) !== -1;