Javascript 为什么这个.substring(index)不起作用?

Javascript 为什么这个.substring(index)不起作用?,javascript,substring,Javascript,Substring,下面是来自的自定义字符串方法 我不希望替换字符替换正在进行的字符,因此我将其更改为 String.prototype.replaceAt = function(index, replacement) { return this.substring(0, index) + replacement + this.substring(index); } 我使用它将“#”替换为“%23”,因为否则浏览器无法理解处的链接,从而导致404错误(我在本地主机服务器上编程)。 我的文件名数组看起来像

下面是来自的自定义字符串方法

我不希望替换字符替换正在进行的字符,因此我将其更改为

String.prototype.replaceAt = function(index, replacement) {
    return this.substring(0, index) + replacement + this.substring(index);
}
我使用它将“#”替换为“%23”,因为否则浏览器无法理解处的链接,从而导致404错误(我在本地主机服务器上编程)。 我的
文件名
数组看起来像

const fileNames = [
    ["template.html", "first.php", "second.php", "comments.php", "predefined.php", "strings.php", "concat.php", 
    "numbers.php", "constants.php", "quotes.php"],
    ["form.html", "handle_form #1.php", "handle_form #2.php", "handle_form #3.php"],
    [""],
    [""],
    [],
    [],
];
然后我在二维数组中循环。最后,我用另一个循环遍历文件名中的每个字符串。如果下面的代码被注释掉,它可以正常工作,但是代码完成的任务没有执行

        for (let k = 0; k < fileNames[i][j].length; k++) {
            if (fileNames[i][j][k] == '#') {
                fileNames[i][j] = fileNames[i][j].replaceAt(k, '%23');
            }
        }
    }
}
for(设k=0;k

问题是,只要我将
index+replacement.length
更改为
index
,页面就会停止加载,并显示一个弹出窗口,说明页面没有响应。为什么会这样?我怎么修理它?

该代码导致无限循环,因为有故障的
replaceAt
版本仅在每个
#
字符前插入所需的子字符串。这意味着代码在处理字符串时,总是会在后面找到另一个
#
字符,因此循环变得无限大并阻塞浏览器

我相信你的意思是用这个来代替:

String.prototype.replaceAt = function(index, replacement) {
    return this.substring(0, index) + replacement + this.substring(index + 1);
}

(请注意,
+1
-这是唯一的更改!)

该代码导致无限循环,因为您的
replaceAt
错误版本只是在每个
#
字符之前插入所需的子字符串。这意味着代码在处理字符串时,总是会在后面找到另一个
#
字符,因此循环变得无限大并阻塞浏览器

我相信你的意思是用这个来代替:

String.prototype.replaceAt = function(index, replacement) {
    return this.substring(0, index) + replacement + this.substring(index + 1);
}

(注意
+1
-这是唯一的改变!)

嗯,不太喜欢那样改变字符串原型

如果您的目标是对哈希字符进行编码,为什么不使用:

encodeURIComponent(“#”)


输出:“%23”

嗯,不太喜欢这样更改字符串原型

如果您的目标是对哈希字符进行编码,为什么不使用:

encodeURIComponent(“#”)


输出:“%23”

耦合一般的东西,然后解决方案

  • 您应该使用浏览器的开发人员工具来查看实际错误是什么,并将其发布
  • 通常不赞成将东西固定在内置对象类型上。我建议使用独立函数
  • 实际解决方案:您发布的代码是插入,而不是替换:它保留在散列中。然后,因为您要离开它,循环会再次“找到”它并永远运行。试试这个:

    String.prototype.replaceAt = function(index, replacement) {
        return this.substring(0, index) + replacement + this.substring(index + numberOfCharsToOmit);
    }
    

    并适当地添加一个数字

    结合一般情况,然后解决问题

  • 您应该使用浏览器的开发人员工具来查看实际错误是什么,并将其发布
  • 通常不赞成将东西固定在内置对象类型上。我建议使用独立函数
  • 实际解决方案:您发布的代码是插入,而不是替换:它保留在散列中。然后,因为您要离开它,循环会再次“找到”它并永远运行。试试这个:

    String.prototype.replaceAt = function(index, replacement) {
        return this.substring(0, index) + replacement + this.substring(index + numberOfCharsToOmit);
    }
    

    并适当地添加一个数字

    您当前的逻辑只是将
    #
    向上移动字符串,导致无限循环:

    String.prototype.replaceAt=函数(索引,替换){
    返回此.substring(0,索引)+替换+此.substring(索引);
    }
    
    console.log('foo#bar'.replaceAt(3,'baz'))您当前的逻辑只是将
    #
    向上移动字符串,导致无限循环:

    String.prototype.replaceAt=函数(索引,替换){
    返回此.substring(0,索引)+替换+此.substring(索引);
    }
    
    console.log('foo#bar'.replaceAt(3,'baz'))