var str = 'абвгдеёжзи';
console.log('(1, 2): ' + str.substr(1, 2)); // '(1, 2): бв'
console.log('(-3, 2): ' + str.substr(-3, 2)); // '(-3, 2): жз'
console.log('(-3): ' + str.substr(-3)); // '(-3): жзи'
console.log('(1): ' + str.substr(1)); // '(1): бвгдеёжзи'
console.log('(-20, 2): ' + str.substr(-20, 2)); // '(-20, 2): аб'
console.log('(20, 2): ' + str.substr(20, 2)); // '(20, 2): '
https://learn.javascript.ru/string#поиск-всех-вхождений
https://learn.javascript.ru/regexp-methods
/*
Для красивого вызова indexOf применяется побитовый оператор НЕ '~'.
Дело в том, что вызов ~n эквивалентен выражению -(n+1), например:
*/
alert( ~2 ); // -(2+1) = -3
alert( ~1 ); // -(1+1) = -2
alert( ~0 ); // -(0+1) = -1
alert( ~-1 ); // -(-1+1) = 0
/*
Как видно, ~n – ноль только в случае, когда n == -1.
То есть, проверка if ( ~str.indexOf(...) ) означает, что результат indexOf отличен от -1, т.е. совпадение есть.
Вот так:
*/
var str = "Widget";
if (~str.indexOf("get")) {
alert( 'совпадение есть!' );
}
// Поиск всех вхождений
var str = "Ослик Иа-Иа посмотрел на виадук"; // ищем в этой строке
var target = "Иа"; // цель поиска
var pos = -1;
while ((pos = str.indexOf(target, pos + 1)) != -1) {
alert( pos );
}