为何string.replace()在函数内失效但外部运行正常?
问题:字符串替换函数无法正常工作
我尝试通过以下函数将给定字符串中的"..."替换为数组中存储的其他字符串,但调用后未达到预期效果:
function addTokens(input, tokens) { let returnInput = input; if ((typeof input === 'string') || (input instanceof String)) { if(input.length >= 6) { for (let i = 0; i < tokens.length; i++) { if((tokens[i].tokenName === 'string') || (tokens[i].tokenName instanceof String)) { returnInput = returnInput.replace("...",`${tokens[i].tokenName}`); } else { //throw new Error("Invalid array format"); } } } else { //throw new Error("Input should have at least 6 characters"); } } else { //throw new Error("Input should be a string"); } return returnInput; }
调用result = addTokens('User ...', [{ tokenName: 'user' }])后,返回的仍是初始字符串"User ...",而非预期的"User user"。但单独运行以下代码时,却能实现预期的替换效果:
let str = "User ..."; let tok = [{ tokenName: "user" }] str = str.replace("...", `${tok[0].tokenName}`); console.log(str);
问题原因
核心错误在于tokenName的类型判断条件写错了:
你写的tokens[i].tokenName === 'string'是在判断tokenName的值是否等于字符串"string",而不是判断它的类型是否为字符串。这导致传入的tokenName: 'user'不满足条件,替换逻辑根本没执行。
另外,input instanceof String的判断意义不大——日常开发中几乎不会用new String()创建字符串包装对象,用typeof input === 'string'就足够判断字符串类型。
修复后的函数
把类型判断条件改成正确的写法即可:
function addTokens(input, tokens) { let returnInput = input; if (typeof input === 'string') { if(input.length >= 6) { for (let i = 0; i < tokens.length; i++) { // 正确判断tokenName是否为字符串类型 if(typeof tokens[i].tokenName === 'string') { returnInput = returnInput.replace("...", `${tokens[i].tokenName}`); } else { //throw new Error("Invalid array format"); } } } else { //throw new Error("Input should have at least 6 characters"); } } else { //throw new Error("Input should be a string"); } return returnInput; }
额外说明
如果需要替换字符串中所有的"..."(而非仅第一个),可以把replace的第一个参数改成转义后的正则表达式:
returnInput = returnInput.replace(/\.\.\./g, `${tokens[i].tokenName}`);
(点号在正则中是通配符,需要用\转义才能匹配真实的点号)
内容的提问来源于stack exchange,提问作者Gabriel Onicala
相关产品推荐
相关产品推荐

