web-dev-qa-db-fra.com

Javascript Uncaught TypeError: Impossible de lire la propriété «0» de non défini

Je sais qu'il y a beaucoup de questions liées à cette erreur et j'ai vérifié la plupart d'entre elles et aucune ne m'aide à résoudre mon problème. (Ce qui semble si facile à déboguer ...)

J'ai un tableau (qui est vide en premier):

var words = [];

Et ma fonction hasLetter, vérifie si nous trouvons une lettre (objet) dans le tableau (que j'appelle ici: d) des mots.

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

et j'ai une fonction appelée addLetter qui vérifie si hasLetter renvoie vrai/faux et crée ou non en conséquence un nouveau nœud.

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

}

et si je teste:

addLetter("a",words);

il renvoie:

Uncaught TypeError: Cannot read property '0' of undefined

Je ne sais pas quoi faire pour dire "si ce n'est pas défini alors ne regardez pas dedans ou quelque chose dans ce sens ...

Merci

11
Greg Uptron

L'erreur est ici:

hasLetter("a",words[]);

Vous passez le premier élément de words, au lieu du tableau.

À la place, passez le tableau à la fonction:

hasLetter("a",words);

Problème résolu!


Voici une description du problème:

Je suppose que dans votre navigateur (chrome lance une erreur différente), words[] == words[0], Donc lorsque vous appelez hasLetter("a",words[]);, vous appelez en fait hasLetter("a",words[0]);. Donc, en substance, vous passez le premier élément de mots à votre fonction, pas le tableau dans son ensemble.

Bien sûr, comme words n'est qu'un tableau vide, words[0] Est undefined. Par conséquent, votre appel de fonction est en fait:

hasLetter("a", undefined);

ce qui signifie que lorsque vous essayez d'accéder à d[ascii], vous essayez en fait d'accéder à undefined[0], d'où l'erreur.

13
theonlygusti

Il n'y a aucune erreur lorsque j'utilise votre code,

mais j'appelle la méthode hasLetter comme ceci:

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