Помощь По Javascript

Valimor

Well-known member
10.04.2010
45
0
#1
Изучаю язык поэтому составляю всякие простенькие программки, вот с одной из них и проблема
<div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">Текст программы1</div></div><div class="sp-body"><div class="sp-content"><!--shcode--><pre><code class='Javascript'>function one(s1,s2,simvolstr)
{//начало функции
var poisk=0 //до оператора цикла
while(true) //цикл
{
k=s1.indexOf(s2,poisk)
if(k>=0)
{
s1=s1.slice(poisk,k)+simvolstr+s1.slice(k+1)
poisk=k+1
}
else break
}
return s1
}//конец функции, дальше вызов функции во внешней проге
alert(one("Хай таварищи маи","а","о"))[/CODE]
Функция должна получить строковые данные, далее обработать их заменив все символы "а" на "о", ну и выдать результат.
//Переменная poisk объявлена до оператора цикла.
Но в результате вместо "Хой товорищи мои" получается: ->->
Окно_вывода.jpg
.


Но если переменную poisk объявить в методе indexOf в самом цикле вот так:
<div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">Текст программы2</div></div><div class="sp-body"><div class="sp-content"><!--shcode--><pre><code class='Javascript'>function one(s1,s2,simvolstr)
{//начало функции
while(true)
{
k=s1.indexOf(s2,poisk=0)// poisk непосредственно в методе
if(k>=0){
s1=s1.slice(poisk,k)+simvolstr+s1.slice(k+1)
poisk=k+1
}
else break
}
return s1
}//конец функции, дальше вызов функции во внешней проге
alert(one("Хай таварищи маи","а","о"))[/CODE]
То функция работает и выводит корректный результат("Хой товорищи мои"). Вот не могу понять почему так... вроде в первом листинге переменную объявил нормально.
 

Вложения

hosm

* so what *
18.05.2009
2 442
6
#2
в 1м варианте замени s1=s1.slice(poisk,k) замени на s1=s1.slice(0,k), так как если более одного вхождения, ты обрезаешь строку с найденной позиции и ищешь потом не с той позиции в обрезанной строке.
во втором случае работает, так как ты на каждой итерации делаешь присваивание poisk=0, а так как предыдущее вхождение ты уже заменил на другой символ, то программа не зацикливается (попробуй заменить символ на сам себя, например)
 

Valimor

Well-known member
10.04.2010
45
0
#3
в 1м варианте замени s1=s1.slice(poisk,k) замени на s1=s1.slice(0,k), так как если более одного вхождения, ты обрезаешь строку с найденной позиции и ищешь потом не с той позиции в обрезанной строке.
во втором случае работает, так как ты на каждой итерации делаешь присваивание poisk=0, а так как предыдущее вхождение ты уже заменил на другой символ, то программа не зацикливается (попробуй заменить символ на сам себя, например)
+
а ведь и точно на последующих заходах начало обрезается,не подумал. спасиб