Javascript 无法替换for循环内字符串的字符

Javascript 无法替换for循环内字符串的字符,javascript,replace,Javascript,Replace,我的代码是这样的 function replaceAll(str, from, to) { let result = '' for(let i = 0 ; i < str.length ; i++) if(str[i]===from) { result = str.replace(from,to) } } return result; } 但是它只改变了“leop”您可以在JavaScript中使用replaceAll()函数 c

我的代码是这样的

function replaceAll(str, from, to) {
  let result = ''
  for(let i = 0 ; i < str.length ; i++) 
  if(str[i]===from) {
       result = str.replace(from,to) 
     }
   }
   return result; 
 }

但是它只改变了“leop”

您可以在JavaScript中使用
replaceAll()
函数

conststr='loop';
log(str.replaceAll('o','e')为什么?

对于简单替换,仅替换第一个匹配的文本。因此,您需要使用
g
-全局文本匹配模式。但您将文本作为变量传递。因此,使用
RegExp
创建正则表达式,如

函数replaceAll(str、from、to){
return str.replace(RegExp(from,'g'),to)
}
让输出=replaceAll('loop','o','e');

console.log(输出);//-->leep'
它告诉你为什么它不起作用

function replaceAll(str, from, to) {
            let result = str;
            for(let i = 0 ; i < str.length ; i++) {
                if(str[i]===from) {
                    result = result.replace(from,to);
                }
            }
            return result; 
        }
函数replaceAll(str、from、to){
设结果=str;
for(设i=0;i
如果您真的想进行循环,您需要将替换的字符串分配给
str
而不是结果,因为您将原始
str
用于替换,但分配给
result

仅替换字符串的第一个查找。如果使用正则表达式,则可以直接替换所有occurrence

函数replaceAll(str、from、to){
for(设i=0;iconsole.log(输出);//-->leep’
您可以通过两种方式解决问题:

  • 使用带有全局修饰符(
    /…/g
    )的函数(每个浏览器都支持)替换所有引用
  • 使用功能(Chrome 85+、Edge 85+、Firefox 77+、Opera 71+、Safari 13.1+支持;Internet Explorer不支持)
let str='loop';
console.log(str.replace(/o/g,'e'));
log(str.replaceAll('o','e')让我们深入研究您的问题,以便您了解这里真正发生的事情


这就是为什么在for循环完成后,
result
变量保持不变的原因



另一件需要注意的事情是,尽管在第一次和第二次迭代中,
结果
变量的值是相同的(
'leop'
),但在第二次循环中,第一次循环中的初始
'leop'
被收集(扔掉)
,以便为其分配另一个值(在我们的例子中是另一个
'leop'

这是非常不清楚的,为什么在这里需要一个循环。@NinaScholz处理
replace(string,…)
只替换该字符串的第一次出现这一事实。但是整个构造很麻烦,只在
from.length==1
woow。。有趣的是str不会改变吗?
str
是一个局部变量,由于要传递一个原语,比如字符串,所以需要为字符串指定一个新值。事实上,我使用了循环来研究,但它非常简单!。好的,我会考虑:)通过这样的构造,您应该总是在将字符串传递给<代码> ReGeXP之前。
function replaceAll(str, from, to) {
            let result = str;
            for(let i = 0 ; i < str.length ; i++) {
                if(str[i]===from) {
                    result = result.replace(from,to);
                }
            }
            return result; 
        }
function replaceAll(str, from, to) {
      let result = ''
          for(let i = 0 ; i < str.length ; i++) 
              if(str[i]===from) {
                  result = str.replace(from,to) 
              }
          }
      return result; 
}
1st iteration : 
  result = 'loop'.replace('o','e') // leop
  // result is now 'leop' and str remains 'loop'

2nd iteration :
  result = 'loop'.replace('o','e') // leop
 // as str remained 'loop', so result will again be 'leop