javascript - 为什么我可以执行 array[3].toUpperCase(),但是当 n=3 (或任何数字)时 array[n].toUpperCase() 会出错

标签 javascript

我正在尝试以这种特定的方式解决编码挑战。

目标是将字符串的每个第二个字母大写。

当我使用 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/

相关文章:

javascript - 在 React.js 中使用 SVG 过滤器属性

javascript - Google Places API Web 服务服务器端解决方案

javascript - ng-selected 不能与 ng-options 或 ng-repeat 一起使用

javascript - 检测安卓设备

javascript - 将 vuejs 组件注册拆分到不同的文件

javascript - 当 ForEach 循环中的每个异步函数都已处理完毕时返回 Promise 结尾 [Javascript/Typescript]

javascript - 使用 firebase 云函数从 firebase 数据库中删除节点

javascript - 在 JavaScript 中循环数组中的对象并创建单独的表

javascript - 如何使用 chartjs 为条形图中的每个条设置颜色?

javascript - 对组件类函数的 Angular ng-change 调用未触发