Есть как минимум четыре способа. Лучший вариант, который также должен быть самым быстрым - благодаря собственному движку RegEx, - расположен сверху. jsperf.com в настоящее время не работает, в противном случае я бы предоставил вам статистику производительности.
Обновление : пожалуйста, найдите тесты производительности здесь и проведите их сами, чтобы улучшить результаты своей работы. Подробности результатов будут приведены позже.
1
("this is foo bar".match(/o/g)||[]).length
//>2
2
"this is foo bar".split("o").length-1
//>2
разделять не рекомендуется. Ресурс голоден. Выделяет новые экземпляры Array для каждого совпадения. Не пытайтесь сделать это для> 100 МБ файла через FileReader. На самом деле вы можете легко наблюдать за использованием ресурса EXACT, используя Chrome profiler option.
3.
var stringsearch = "o"
,str = "this is foo bar";
for(var count=-1,index=-2; index != -1; count++,index=str.indexOf(stringsearch,index+1) );
//>count:2
4
поиск одного символа
var stringsearch = "o"
,str = "this is foo bar";
for(var i=count=0; i<str.length; count+=+(stringsearch===str[i++]));
//>count:2
Обновление:
5
сопоставление и фильтрация элементов, не рекомендуется из-за общего распределения ресурсов вместо использования Pythonian 'generators'
var str = "this is foo bar"
str.split('').map( function(e,i){ if(e === 'o') return i;} )
.filter(Boolean)
//>[9, 10]
[9, 10].length
//>2
Доля:
Я сделал это gist , используя в настоящее время 8 методов подсчета символов, чтобы мы могли напрямую объединять наши идеи и делиться ими - просто для удовольствия и, возможно, с некоторыми интересными тестами:)
https://gist.github.com/2757250