我正在尝试以这种特定的方式解决编码挑战。
目标是将字符串的每个第二个字母大写。
当我使用 letterArray[0] 或任何其他数字运行代码时,代码运行完美。但当我将其切换到 letterArray[n] 时,代码崩溃了。我收到的错误消息显示:
Cannot read property 'toUpperCase' of undefined.
为什么 letterArray[n].toUpperCase() 未定义,而 letterArray[n].toUpperCase() 未定义?理解基本原理是我真正关心的问题。
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)
最佳答案
您的输入字符串有 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
}
关于javascript - 为什么我可以执行 array[3].toUpperCase(),但是当 n=3 (或任何数字)时 array[n].toUpperCase() 会出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58036471/