web-dev-qa-db-ja.com

Javascript Uncaught TypeError:未定義のプロパティ「0」を読み取ることができません

このエラーに関連する質問がたくさんあることは知っていますが、それらのほとんどを確認しましたが、私の問題を解決する助けにはなりません。 (デバッグはとても簡単に思えます...)

私は配列を持っています(最初は空です):

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; }

また、hasLetterがtrue/falseを返すかどうかをチェックし、それに応じて新しいノードを作成するかどうかを確認するaddLetterという関数があります。

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

「何も定義されていない場合は、その行に沿って何かを調べないでください...」.

ありがとう

11
Greg Uptron

エラーは次のとおりです。

hasLetter("a",words[]);

配列ではなく、wordsの最初の項目を渡します。

代わりに、配列を関数に渡します。

hasLetter("a",words);

問題が解決しました!


問題の内訳は次のとおりです。

私はあなたのブラウザで推測しています(クロムは別のエラーをスローします)、words[] == words[0]、したがって、hasLetter("a",words[]);を呼び出すと、実際にはhasLetter("a",words[0]);を呼び出しています。したがって、本質的には、単語の最初の項目を関数に渡しますnot全体としての配列。

もちろん、wordsは空の配列であるため、words[0]undefinedです。したがって、実際の関数呼び出しは次のとおりです。

hasLetter("a", undefined);

つまり、d[ascii]にアクセスしようとすると、実際にはundefined[0]にアクセスしようとしているため、エラーになります。

13
theonlygusti

コードを使用してもエラーはありませんが、

しかし、私はhasLetterメソッドを次のように呼び出しています:

hasLetter("a",words);
3
Akash Chavda