【问题标题】:Javascript Uncaught TypeError: Cannot read property '0' of undefinedJavascript Uncaught TypeError:无法读取未定义的属性“0”
【发布时间】:2015-06-08 11:40:55
【问题描述】:

我知道有很多与此错误相关的问题,并且我已经检查了大部分问题,但没有一个可以帮助我解决我的问题。 (这似乎很容易调试......)

我有一个数组(一开始是空的):

var words = [];

我的函数 hasLetter,检查我们是否在数组中找到了一个字母(对象)(我在这里称之为:d)单词。

function hasLetter(letter,d){

// if words[0] not null should return object of letter "a", here we getting
// the index of the letter (since ascii of "a" is 97, I substract 97)
var ascii = letter.charCodeAt(0)-97;

//Trying to not get an error with this but still creates an err
if(typeof d[ascii ] !== "undefined" && d[ascii ] !== null && d[ascii ].length > 0){
    if(d[ascii].letter == letter){
        return true;
    }
}
return false; }

我有一个名为 addLetter 的函数,它检查 hasLetter 是否返回 true/false,然后相应地创建或不创建新节点。

function addLetter(letter,d){
var ascii = letter.charCodeAt(0)-97;
if(!hasLetter(letter,d)){
    document.write("This letter" + letter + " hasn't been found in words.");
    d[ascii] = new Node(letter);
}
    document.write("This letter " + letter + " already exists in words.");
    document.write(d[ascii].letter);

}

如果我测试:

addLetter("a",words);

它返回:

Uncaught TypeError: Cannot read property '0' of undefined

我不知道该怎么说“如果它是未定义的,那么不要调查它或类似的东西......

谢谢

【问题讨论】:

  • 如果你想在数组中找到一个字母,那么 (words.indexOf(letter) > 0) 将返回你是否存在这个字母。
  • 你不能做hasLetter("a",words[]);,应该是hasLetter("a",words);
  • @mohamedrias 不,不会的。
  • 您使用的是哪种浏览器?
  • @Greg 谢谢我浪费了我 1 天的时间来调试,当我来到这里并解决了我的问题

标签: javascript arrays error-handling typeerror


【解决方案1】:

错误在这里:

hasLetter("a",words[]);

您传递的是words 的第一项,而不是数组。

相反,将数组传递给函数:

hasLetter("a",words);

问题解决了!


以下是问题所在的细分:

我猜在你的浏览器中(chrome 会抛出一个不同的错误)words[] == words[0],所以当你调用hasLetter("a",words[]); 时,你实际上是在调用hasLetter("a",words[0]);。因此,本质上,您将第一项单词传递给您的函数,而不是整个数组。

当然,因为words 只是一个空数组,所以words[0] 就是undefined。因此,你的函数调用实际上是:

hasLetter("a", undefined);

这意味着,当您尝试访问d[ascii] 时,您实际上是在尝试访问undefined[0],因此会出现错误。

【讨论】:

  • 是的,我通过添加“[]”使我的调用 hasLetter 失败,但我的错误实际上来自另一个函数(它来自这个函数,但调用另一个函数时)。我将创建一个新线程(或者我应该更新这个线程吗?)但感谢您解释这一点,它有帮助:)
  • 好的,是的,这是有道理的;我对您遇到的错误感到困惑,我原以为它会更像“意外]”。不管怎样,谢谢!如果您对此答案投赞成票,我将获得 2k 次重复!
【解决方案2】:

我使用你的代码没有错误,

但我这样调用hasLetter 方法:

hasLetter("a",words);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-28
    • 2017-07-20
    • 1970-01-01
    • 2020-03-28
    • 2023-04-11
    相关资源
    最近更新 更多