这两个文本块之间有什么区别

What is the difference between these two blocks of texts

第一个功能不起作用。它显示消息“Uncaught TypeError TypeError: Cannot read properties of undefined (reading 'toUpperCase')”

这些是代码:

//this is the one with error
function myReplace(str, before, after){
    var index = str.indexOf(before);
    if (str[index] === str[index].toUpperCase()) {
        after = after.charAt(0).toUpperCase()+ after.slice(1);
    }else{
        after = after.charAt(0).toLowerCase() + after.slice(1);

    }
    str = str.replace(before, after);
    return str;
    }

myReplace("A quick brown fox jump over the lazy dog", "jumped", "leaped");


//This apparently works fine.
function myReplace(str, before, after){
    var index = str.indexOf(before);
    if (str[index] === str[index].toUpperCase()) {
        after = after.charAt(0).toUpperCase()+ after.slice(1);
    }else{
        after = after.charAt(0).toLowerCase() + after.slice(1);

    }
    str = str.replace(before, after);
    return str;
    }
myReplace("A quick brown fox jumped over the lazy dog", "jumped", "leaped");

代码在语义上不正确。在第一个示例中,您从不使用“jumped”一词,而是使用“jump”。因此不能使用 indexOf 函数的结果。请参阅以下代码片段以进一步了解问题所在。 如果 indexOf 函数找不到子串,它将 return a -1.

由于您无法访问数组中的 -1,因此会 return 出现错误。您应该始终在代码中处理这些边缘情况,以避免不必要的行为。我在尝试访问某些内容之前添加了索引检查。

//this is the one with error
function myReplace(str, before, after){
    var index = str.indexOf(before);
    console.log(index);
    if(index < 0){
      return "error index not found"
    }
    if (str[index] === str[index].toUpperCase()) {
        after = after.charAt(0).toUpperCase()+ after.slice(1);
    }else{
        after = after.charAt(0).toLowerCase() + after.slice(1);

    }
    str = str.replace(before, after);
    return str;
    }

myReplace("A quick brown fox jump over the lazy dog", "jumped", "leaped");

在第一种情况下,索引是 -1,因为字符串“jumped”不是 str 的一部分 --> 所以 str[index] 基本上是“undefined”,你不能用 undefined 调用 toUpperCase() .

在秒的情况下,索引是 18 并且 str[index] 是“j”所以你可以调用 toUpperCase() 因为它是一个 char

您的输入有误! 两者的功能是一样的。但是在您的第一个实现中,您的短语中有“jump”,并且您正在搜索“jumped”,这将以错误告终。

此实现:

myReplace("A quick brown fox jumped over the lazy dog", "jumped", "leaped");

永远有效