为什么不't.toUpperCase()将str[i]大写

Why doesn't .toUpperCase() capitalize str[i]?

本文关键字:str 大写 toUpperCase 为什么不      更新时间:2023-09-26

执行CoderByte挑战:

使用JavaScript语言,具有LetterChanges(str)函数获取正在传递的str参数,并使用以下命令对其进行修改算法。将字符串中的每个字母替换为字母在字母表中跟随它(即c变为d,z变为a)。然后将这个新字符串中的每个元音(a、e、i、o、u)大写,最后返回这个修改后的字符串。

我的解决方案:

function LetterChanges(str) {
    var alphabet = "abcdefghijklmnopqrstuvwxyza",
        vowels = "aiueo",
        newstr = '';
    for (var i = 0; i < str.length; i++) {
        if (alphabet.indexOf(str[i]) != -1) {
            newstr += alphabet[alphabet.indexOf(str[i]) + 1];
        } else {
            newstr += str[i];
        }  
    }

    for (var i = 0; i < vowels.length; i++) {
        for (var j = 0; j < newstr.length; j++) {
            //toUppercase the vowel in the newstring once found
            if (newstr[j] == vowels[i]) {
                newstr[j] = newstr[j].toUpperCase(); 
            }
        }
   }
   return newstr;
} 
show(LetterChanges("fun times"));
show(LetterChanges("hello*3"));

toUpperCase()没有将我想要的元音大写。不过这似乎是正确的。我甚至尝试过这样的东西:

if (newstr[j] == vowels[i]) {
   var toCap = newstr[j].toString();
   newstr[j] = toCap.toUpperCase();
}

如果你想找到更好的解决方案,请回答toUpperCase()部分,然后推荐另一个解决方案。

Javascript中的字符串是基元类型,而不是对象。

当您在基元类型(例如str[i] = 'a')中设置属性时,Javascript会为该值创建一个新的装箱对象,对其进行变异,然后将其丢弃。

有关更多详细信息,请参阅规范

相反,您应该将新字符串组装到一个可变数组中,然后调用.join('')将其转换为字符串。

您可以创建另一个字符串来构建返回字符串,请参阅下面代码中的修复程序

function LetterChanges(str) {
    var alphabet = "abcdefghijklmnopqrstuvwxyza",
        vowels = "aiueo",
        newstr = '',
        returnStr = ''; //added to next step
    for (var i = 0; i < str.length; i++) {
        if (alphabet.indexOf(str[i]) != -1) {
            newstr += alphabet[alphabet.indexOf(str[i]) + 1];
        } else {
            newstr += str[i];
        }  
    }

    for (var i = 0; i < vowels.length; i++) {
        for (var j = 0; j < newstr.length; j++) {
            //toUppercase the vowel in the newstring once found
            if (newstr[j] == vowels[i]) {
                returnStr += newstr[j].toUpperCase(); 
            }else{
                returnStr += newstr[j];
            }
        }
   }
   return returnStr ;
} 

您可以通过replace和大写函数将元音大写:

newstr = newstr.replace(
           /[aeiou]/g,           // replace all vowels
           function(letter) {    // called for each match
             return letter.toUpperCase();
           }
         );

示例:http://codepen.io/paulroub/pen/tvhcF

字符串的内容不能更改,即它们是不可变的。创建一个新字符串,而不是尝试在位编辑。

您可以使用以下代码让您的生活变得轻松

     function LetterChanges(str) { 
    return str.replace(/[a-zA-Z]/g,function(x) {
    return String.fromCharCode(x.charCodeAt(0)+1); }).replace(/[aeiou]/g,function(y) {
    return y.toUpperCase(); 
    });
  }