2016-08-25 1 views
0

Dans le code suivant, je m'attendrais à ce qu'un tableau bidimensionnel soit produit, pré-rempli avec des zéros. Le problème que j'obtiens est que x[0][3] = 2 semble se produire trop rapidement, donc au moment du journal de la console à l'intérieur de la fonction, le tableau a déjà une valeur modifiée. Je n'arrive pas à y remédier, même avec des délais d'attente. Que se passe-t-il?Pourquoi ce tableau 2D génère-t-il des résultats inattendus?

function test(size) { 
    var row = []; 
    var return_me = []; 
    for (var i=0; i < size; i++) { row.push(0); } 
    for (var j=0; j < size; j++) { return_me.push(row.slice()); } 
    console.log("1:"); 
    console.log(return_me); 
    return return_me; 
} 

var x = null; 
console.log("0:"); 
console.log(x); 
x = test(5); 
console.log("2:"); 
console.log(x); 
x[0][3] = 2; 
console.log("3:"); 
console.log(x); 

Le résultat inattendu est au « 1: » dans la sortie, où je reçois:

0: 0 
1: 0 
2: 0 
3: 2 
4: 0 
+1

Y a-t-il une _erreur_ réelle ou le journal semble-t-il inattendu? – Xufox

+0

Quels sont les résultats du journal que vous trouvez inattendus? –

+0

Désolé, c'était trompeur: il n'y a pas d'erreur. Je mets à jour la question avec plus de détails pour être plus clair. –

Répondre

2

Comme tableau est un objet, vous verrez la valeur réelle (dernière) de ce que console.log() montre une référence à l'objet et au moment où vous l'ouvrez, la valeur a changé.

L'option est d'utiliser console.dir() pour imprimer l'état actuel de l'objet (bien que console.dir() ne fonctionne pas sur le chrome).

Si vous souhaitez obtenir la valeur réelle en chrome, imprimez cette valeur, pas tout l'objet. Vous pouvez regarder this post pour plus d'explications et plus d'informations.

+0

J'espérais que c'était quelque chose comme ça (pas ma fonction elle-même). Merci! –

+0

ouais, je pense que tout le monde codant JS trébuche sur cette chose tôt ou tard. :RÉ –