为什么代码看起来有效,但结果中还包含未定义的内容?
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+=theChar
将 undefined
转换为字符串并附加它。
你想要 < str.length
,而不是 <=
。
你迭代太多次了。更改为:
for(i=0;i<str.length;i++)
当你有 i<=str.length
时,这意味着你必须迭代,只要 i 等于字符串的长度。当我从 0 开始时,结束值将是最后一个字母的位置 + 1.
最后一次迭代 (str[i]
) 在此位置没有任何价值。
我下面的代码来自 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+=theChar
将 undefined
转换为字符串并附加它。
你想要 < str.length
,而不是 <=
。
你迭代太多次了。更改为:
for(i=0;i<str.length;i++)
当你有 i<=str.length
时,这意味着你必须迭代,只要 i 等于字符串的长度。当我从 0 开始时,结束值将是最后一个字母的位置 + 1.
最后一次迭代 (str[i]
) 在此位置没有任何价值。