我该如何解决:未捕获的TypeError:无法读取JavaScript中未定义的属性'toString'

时间:2019-09-05 10:40:40

标签: javascript

试图编写一个函数,该函数需要一个字符串,并以大写每个单词的第一个字母返回该字符串。我能够做到。但是我一直在迭代中获得第一个索引值的不确定值,直到列表中有项目。

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

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

但是我不明白为什么会得到:未捕获的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弦乐练习”

这些是不同的console.log结果

“” js s 串 串 演习 练习“”

但是我的函数最终没有执行...它引发了这个问题:

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

3 个答案:

答案 0 :(得分:0)

所以

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

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

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

  4. 您要返回一个数组,并且我假设您要使用String,因此可以在数组上使用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"))

答案 1 :(得分:0)

请检查修改

  • 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");

答案 2 :(得分:0)

一个数组从索引号0开始。newStringList的长度为3。如果给出的长度小于(<),则'i'会像0(“ js”),1(“ string”),2 (“运动”)。如果给出的值小于等于(<=),它将像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"))