我下面的代码来自coderbyte.com挑战。我是一个初学者,所以所有建设性的批评都是受欢迎的。我知道我可以用它。挑战要求取一个字符串并用字母表中的后面的字母替换字符串中的每个字母(即c变为d,z变为a)。然后将这个新字符串(a,e,i,o,u)中的每个元音大写,最后返回修改后的字符串。下面的代码应该修改我提供的字符串(在这种情况下 - " Hello World!")但我无法弄清楚为什么它导致显示正确的代码然后' undefined& #39 ;.任何人都可以对此有所了解吗?
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;
}
答案 0 :(得分:2)
您忘记了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
部分以避免这种情况,或仅使用<
代替<=
。
答案 1 :(得分:1)
当i
等于字符串的长度(上次点击i<=str.length
时)时,str[i]
为undefined
,因此它会触及其他分支{ {1}}将revised+=theChar
转换为字符串并附加。
您需要undefined
,而不是< str.length
。
答案 2 :(得分:1)
你迭代它太多次了。改为:
for(i=0;i<str.length;i++)
当你有i<=str.length
这意味着你必须迭代,只要我将对字符串的长度进行euqal。当我从0开始时,结束值将是最后一个字母+ 1的位置。
上次迭代(str[i]
)在此广告中没有任何价值。