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

Posted

技术标签:

【中文标题】我该如何解决这个问题:未捕获的类型错误:无法读取 javascript 中未定义的属性“toString”【英文标题】:how can i fix this: Uncaught TypeError: Cannot read property 'toString' of undefined in javascript 【发布时间】:2020-01-08 05:57:28 【问题描述】:

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

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

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

但我不明白为什么我得到:未捕获的类型错误:无法读取未定义的属性“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 JS 细绳 细绳 练习 练习""

但我的函数最终没有执行......它抛出了这个:

"""learnJs.js:100 Uncaught TypeError: Cannot read property 'toString' of undefined 在大写字母 (learnJs.js:100) 在 learnJs.js:110"""

【问题讨论】:

for 循环条件应该是 &lt; 而不是 &lt;=。此外,没有理由在已经是字符串的情况下调用 .toString() 另外,.push() 必须在循环内部,而不是外部。 【参考方案1】:

所以

    字符串上不需要toString()

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

    你在循环之后调用addAll,所以它只添加最后一个元素。

    你正在返回一个数组,我假设你想要字符串,所以你可以在数组上使用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"))

【讨论】:

一切都很清楚。很好的洞察力。工作中。因此,根据您的第 2 点,未定义来自 @vially 是的。检查代码的控制台输出。它按此顺序打印jsstringexercisesundefined。因此,它正确地遍历元素并打印它们,并且仅在抛出错误之后。如果错误出现在第一个元素上,您将看不到其余代码的工作 @vially 考虑将答案标记为已接受,以便将问题标记为已回答。见这里"What should I do when someone answers my question?"【参考方案2】:

请检查修改

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

【讨论】:

【参考方案3】:

一个数组从索引号 0 开始。newStringList 的长度是 3。如果你给一个小于 (

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

【讨论】:

以上是关于我该如何解决这个问题:未捕获的类型错误:无法读取 javascript 中未定义的属性“toString”的主要内容,如果未能解决你的问题,请参考以下文章

未捕获的类型错误:无法读取未定义的属性 XXX

如何解决未捕获的类型错误:无法读取未定义的属性“调用”?

如何解决“未捕获的类型错误:无法读取未定义的属性'get'”? (Vue.JS 2)

未捕获的类型错误:无法读取未定义的属性“替换”

未捕获的类型错误:无法读取未定义的属性“顶部”

未捕获的类型错误:无法读取 null 的属性“道具”