【问题标题】:Why can I do array[3].toUpperCase(), but array[n].toUpperCase() errors when n=3 (or any num)为什么我可以做 array[3].toUpperCase(),但是当 n=3(或任何 num)时 array[n].toUpperCase() 错误
【发布时间】:2019-09-21 00:50:49
【问题描述】:

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

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

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

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

为什么 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)

【问题讨论】:

  • iindex 始终相同,并且循环仅在 index &lt; theStringLength 期间运行,因此 i 始终在界限内。到现在为止还挺好。但是ni 大一。

标签: javascript


【解决方案1】:

您的输入字符串有 13 个字符。您的循环从 0 开始,递增 2 直到达到限制,因此它以值 0、2、4、6、8、10 和 12 运行。您的 n 也递增 2,但从 1 开始,所以n 的值是 1、3、5、7、9、11 和 13。索引 13 超出了数组的末尾,因此您读取了一个 undefined 值,并尝试在其上调用 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
}

【讨论】:

    【解决方案2】:

    让我们参考您的代码,您正在运行循环theStringLength time,它表示字符串的长度,这是按预期工作的。但是,当您将变量 i 和 n 增加相同的数字但具有不同的初始值时,即发生错误的地方,值 i 保持在边界内,因为 iindex 的初始值相同,如果您将i 的初始值更改为1 并将n 更改为0,它现在应该为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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-12-21
      • 2016-04-15
      • 1970-01-01
      • 1970-01-01
      • 2014-09-22
      • 1970-01-01
      • 2023-03-05
      • 2016-12-31
      相关资源
      最近更新 更多