为什么代码看起来有效,但结果中还包含未定义的内容?

Why does the code seem to work yet also include undefined in the result?

我下面的代码来自 coderbyte.com 挑战。我是初学者,所以欢迎所有建设性的批评。我知道我可以使用它。挑战要求获取一个字符串,并将字符串中的每个字母替换为字母表中紧随其后的字母(即 c 变为 d,z 变为 a)。然后将这个新字符串中的每个元音 (a, e, i, o, u) 大写,最后 return 修改后的字符串。下面的代码应该会修改我提供的字符串(在本例中为 "Hello World!"),但我无法弄清楚为什么它会导致显示正确的代码然后显示 'undefined'。任何人都可以阐明这一点吗?

Ifmmp xpsmE!undefined

代码如下:

var str = "Hello World!";
console.log(change_letter(str));

function change_letter(str){
  var revised="";
  for(i=0;i<=str.length;i++){
    var theChar = str[i];
    if((theChar>='a' && theChar<'z') ||
       (theChar>='A' && theChar<'Z')){
      var charCode = str.charCodeAt(i);
      var newCharCode = charCode+1;
      var newLetter = String.fromCharCode(newCharCode).toLowerCase();
      if (newLetter==='a' || newLetter === 'e' 
            || newLetter === 'i' || newLetter === 'o' 
            || newLetter === 'u'){
        newLetter = newLetter.toUpperCase();
      }
      revised+=newLetter;
    }
    else if(theChar==='z' || theChar==='Z'){
      revised+='a';
    }
    else revised+=theChar;
  }
  return revised;
}

您忘记了 str.length 属性 实际上会比长度多 1,因为数组从索引 0 开始。尝试将循环更改为:

for(i=0;i<=str.length-1;i++){

或:

for(i=0;i<str.length;i++){

你看到 undefined 的原因是因为当循环到达它的最后一次迭代时,i 的值等于字符串的长度,所以当它查找 str[i],它没有找到它,因此附加了 undefined 。

最后一个元素的索引实际上是长度减一,因为索引从零开始。所以在你的 for 循环中,你添加 -1 部分来避免这种情况,或者只使用 < 而不是 <=.

i等于字符串长度时(最后一次命中i<=str.length)则str[i]undefined,因此命中else分支revised+=theCharundefined 转换为字符串并附加它。

你想要 < str.length,而不是 <=

你迭代太多次了。更改为:

for(i=0;i<str.length;i++)

当你有 i<=str.length 时,这意味着你必须迭代,只要 i 等于字符串的长度。当我从 0 开始时,结束值将是最后一个字母的位置 + 1.

最后一次迭代 (str[i]) 在此位置没有任何价值。