Javascript 为什么我可以在n=3(或任意num)时执行数组[3].toUpperCase(),但数组[n].toUpperCase()会出错

Javascript 为什么我可以在n=3(或任意num)时执行数组[3].toUpperCase(),但数组[n].toUpperCase()会出错,javascript,Javascript,我正试图以这种特定的方式解决编码难题 目标是将字符串的每2个字母大写 当我使用letterArray[0]或任何其他数字运行代码时,代码运行得非常完美。但当我切换到letterArray[n]时,代码崩溃了。我收到的错误消息是: 无法读取未定义的属性“toUpperCase” 为什么letterArray[n].toUpperCase()未定义,而letterArray[n].toUpperCase()未定义?了解基本面是我真正关心的问题 让字符串=“abcdefghijklm”//good

我正试图以这种特定的方式解决编码难题

目标是将字符串的每2个字母大写

当我使用letterArray[0]或任何其他数字运行代码时,代码运行得非常完美。但当我切换到letterArray[n]时,代码崩溃了。我收到的错误消息是:

无法读取未定义的属性“toUpperCase”

为什么letterArray[n].toUpperCase()未定义,而letterArray[n].toUpperCase()未定义?了解基本面是我真正关心的问题

让字符串=“abcdefghijklm”//good
让字符串长度=字符串长度//好
让letterArray=theString.split(“”;//好的
设newArray=[];//好的
设i=0;//好的
设n=1
对于(让索引=0;索引<字符串长度;索引+=2){
设lowCaseLetter=letterArray[i]
newArray+=lowCaseLetter
i+=2
让upCaseLetter=letterArray[n].toUpperCase();
//如果我将其更改为letterArray[0],代码将非常有效
newArray+=upCaseLetter
n+=2
}

console.log(newArray)
您的输入字符串有13个字符。循环从0开始,递增2直到达到极限,因此它以值0、2、4、6、8、10和12运行。您的
n
也会增加2,但从
1
开始,因此
n
的值为1、3、5、7、9、11和13。索引13超过了数组的末尾,因此您读取了一个
未定义的
值,并尝试对其调用
toUpperCase

你需要修正你的代码,这样你就不需要一个长度均匀的输入;正如所写的,您的代码假设它总是可以为每一个偶数读取一个奇数索引,而奇数长度输入永远不会是这种情况

一种解决方案是避免在每个循环中处理偶数和奇数,而是在执行时确定是否使用大写,例如:

for (let index = 0; index < theStringLength; ++index) {  // Only increment by 1
    let val = letterArray[index];  // Read out value
    if (index % 2 === 1) val = val.toUpperCase();  // Convert to upper case for odd indices
    newArray += val;  // Append to result
}
for(让index=0;index
让我们参考您的代码,您正在运行循环
字符串长度
时间,它表示字符串的长度,这是预期的工作。但是,由于变量i和n以相同的数字递增,但初始值不同,即出现错误的地方,如果将
i
index
的初始值更改为1而
n
更改为0,则值i保持在范围内,因为
i和
index
的初始值相同,现在它应该为
i
抛出相同的错误

希望这个解释能有所帮助

   let theString = "abcdefghijklm" // good
   let theStringLength = theString.length // good 
   let letterArray = theString.split(""); // good
   let newArray = []; // good
   let i = 0; // good
   let n = 1
   for (let index = 0; index < theStringLength; index += 2) {
     let lowCaseLetter = letterArray[i]
     newArray += lowCaseLetter
     i += 2
     let upCaseLetter = letterArray[n].toUpperCase();
     //if i change this to letterArray[0] the code works perfectly
     newArray += upCaseLetter
     n += 2
   }
   console.log(newArray)
让字符串=“abcdefghijklm”//good
让字符串长度=字符串长度//好
让letterArray=theString.split(“”;//好的
设newArray=[];//好的
设i=0;//好的
设n=1
对于(让索引=0;索引<字符串长度;索引+=2){
设lowCaseLetter=letterArray[i]
newArray+=lowCaseLetter
i+=2
让upCaseLetter=letterArray[n].toUpperCase();
//如果我将其更改为letterArray[0],代码将非常有效
newArray+=upCaseLetter
n+=2
}
console.log(newArray)

i
index
始终相同,循环只在
index
时运行,因此
i
始终在边界内。到现在为止,一直都还不错。但是
n
大于
i