为什么代码似乎有效,但结果中也包含未定义

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

本文关键字:结果 包含 未定义 代码 有效 为什么      更新时间:2023-09-26

我下面的代码来自一个 coderbyte.com 挑战。我是初学者,所以欢迎所有建设性的批评。我知道我可以使用它。挑战要求取一个字符串,并用字母表中它后面的字母替换字符串中的每个字母(即 c 变为 d,z 变为 a)。然后将这个新字符串中的每个元音大写(a,e,i,o,u),最后返回修改后的字符串。下面的代码应该修改我提供的字符串(在这种情况下 - "Hello World!"),但我无法弄清楚为什么它会导致显示正确的代码,然后"未定义"。谁能对此有所了解?

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]时,它找不到它,因此附加了未定义。

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

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

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

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

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

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

上次迭代 ( str[i] ) 在此平台中没有任何值。