开发者问题收集

我该如何修复此问题:未捕获的类型错误:无法读取 javascript 中未定义的属性“toString”

2019-09-05
6632

尝试编写一个函数,该函数接受一个字符串,并返回每个单词首字母大写的字符串。我可以这样做。但是我在迭代中的第一个索引值处不断获得未定义的值,尽管我的列表中有项目。

我编写了一个接受字符串参数的函数。我使用 split(" ") 方法将参数传递给 split,这样我就可以得到一个单词数组。当我创建 forloop 来遍历所有单词时,能够使每个单词的首字母都大写。现在在迭代中,我创建了一个变量来存储使用 toString() 方法转换为字符串的第一个索引元素,以便稍后可以对其应用 toUpperCase() 方法

当我在 for 循环中执行 console.log() 时,我可以看到转换后的元素全部列出(当我执行该函数并将字符串传递给它时)

但我不明白为什么我会得到:Uncaught TypeError:无法读取未定义的属性“toString”......并且此错误指向保存索引 [i] 处的元素的变量,当我在 forloop 中将其转换为字符串时:var pickString = newStringList[i].toString()

function capitalizeLertters (letter) {
    var newStringList = letter.split(" ");
    // console.log(newStringList[0])
    var addAll = []

    for (var i = 0; i <= newStringList.length; i++) {
        console.log(newStringList[i])
        var pickString = newStringList[i].toString()
        // console.log(pickString)
        var finalString = pickString.charAt(0).toUpperCase() + pickString.slice(1)
        // console.log(finalString)
    }
    addAll.push(finalString)
    // console.log(addAll)
    return addAll
}

console.log(capitalizeLertters("js string exercises"))

这是我预期的结果: “Js String Exercises”

这些是不同的 console.log 结果

“”js Js string String exercises Exercises“”

但我的函数没有在结束...它抛出了这个:

“”“learnJs.js:100 未捕获 TypeError:无法读取未定义的属性“toString” at capitalizeLertters (learnJs.js:100) at learnJs.js:110“”“

3个回答

因此

  1. 您不需要对字符串使用 toString()

  2. for 循环在最后一个元素处崩溃,因为您应该在 length -1 处停止,或者只需将 <= 替换为 <

  3. 您在循环后调用 addAll ,因此它只会添加最后一个元素。

  4. 您正在返回一个数组,我假设您想要字符串,因此您可以在数组上使用 join()

function capitalizeLertters (letter) {
    var newStringList = letter.split(" ");    
    var addAll = [];

    for (var i = 0; i < newStringList.length; i++) {         
        var pickString = newStringList[i];           
        var finalString = pickString.charAt(0).toUpperCase() + pickString.slice(1);
        addAll.push(finalString);
    }
          
    return addAll.join(" ");
}

console.log(capitalizeLertters("js string exercises"))
Raul Rene
2019-09-05

请检查修改

  • push() 方法应位于循环内。
  • 您从索引 0 开始循环,这就是您需要使用 < 而不是 <= 的原因
  • 最后需要使用 join 方法从数组中获取字符串

解决方案

function capitalizeLertters (letter) {
    var newStringList = letter.split(" ");
    // console.log(newStringList[0])
    var addAll = [];

    for (var i = 0; i < newStringList.length; i++) {
        console.log(newStringList[i]);
        var pickString = newStringList[i];
        // console.log(pickString)
        var finalString = pickString.charAt(0).toUpperCase() + pickString.slice(1);
        // console.log(finalString)
        addAll.push(finalString);
    }
    // console.log(addAll)
    return addAll.join(" ");
}

capitalizeLertters("js string exercises");
Kankatala Krishna
2019-09-05

数组以索引号 0 开始。newStringList 的长度为 3。如果给出小于 (<),则 'i' 将类似于 0("js")、1("string")、2("exercises")。如果给出小于等于 (<=),则将类似于 0("js")、1("string")、2("exercises")、3(undefined)。

  function capitalizeLertters (letter) {
  var newStringList = letter.split(" ");

  var addAll = ""

  for (var i = 0; i < newStringList.length; i++) {

  var pickString = newStringList[i].toString()

  var finalString = pickString.charAt(0).toUpperCase() + pickString.slice(1)
  addAll += finalString
  if(i != newStringList.length-1){
    addAll +=" "
  }
}


return addAll
}

console.log(capitalizeLertters("js string exercises"))
Fathma Siddique
2019-09-05