117 votes

console.log() montre la valeur modifiée d'une variable avant que la valeur ne change réellement.

Ce bout de code, je le comprends. Nous faisons une copie de A et l'appelons C. Quand A est modifié, C reste le même.

var A = 1;
var C = A;
console.log(C); // 1
A++;
console.log(C); // 1

Mais lorsque A est un tableau, la situation est différente. Non seulement C change, mais il change avant même que nous touchions à A.

var A = [2, 1];
var C = A;
console.log(C); // [1, 2]
A.sort();
console.log(C); // [1, 2]

Quelqu'un peut-il expliquer ce qui s'est passé dans le deuxième exemple ?

119voto

Ka Tech Points 2289

Console.log() On lui passe un référence à l'objet, de sorte que la valeur dans la Console change au fur et à mesure que l'objet change. Pour éviter cela, vous pouvez :

console.log(JSON.parse(JSON.stringify(c)))

MDN met en garde :

Attention, si vous enregistrez des objets dans les dernières versions de Chrome et de Firefox, ce que vous obtenez sur la console est une référence à l'objet, qui n'est pas nécessairement la "valeur" de l'objet au moment où vous appelez la fonction console.log() mais c'est la valeur de l'objet au moment où vous ouvrez la console.

36voto

raychz Points 365

Les dernières orientations de l Mozilla à partir de mai 2022 :

N'utilisez pas console.log(obj) utiliser console.log(JSON.parse(JSON.stringify(obj))) .

De cette manière, vous êtes sûrs de voir la valeur de obj au moment où vous l'enregistrez. Sinon, de nombreux navigateurs fournissent une vue en direct qui se met constamment à jour au fur et à mesure que les valeurs changent. Ce n'est peut-être pas ce que vous souhaitez.

14voto

Pointy Points 172438

Les tableaux sont objets . Variables se référer à aux objets. Ainsi, une assignation dans le second cas copiait le fichier référence (une adresse) au tableau de "A" à "C". Après cela, les deux variables font référence au même objet unique (le tableau).

Les valeurs primitives comme les nombres sont entièrement copiées d'une variable à l'autre dans des affectations simples comme la vôtre. L'instruction "A++ ;" attribue une nouvelle valeur à "A".

Pour le dire autrement : la valeur d'une variable peut être soit une valeur primitive (un nombre, un booléen, etc.), null ou une chaîne de caractères), ou il peut être un référence à un objet. Le cas des primitives de chaînes de caractères est un peu bizarre, car elles ressemblent plus à des objets qu'à des valeurs primitives (scalaires), mais elles sont immuables et il est donc possible de prétendre qu'elles sont comme des nombres.

5voto

Shedal Points 6482

EDIT : Je garde cette réponse pour préserver les commentaires utiles ci-dessous.

@Esailija a en fait raison - console.log() n'enregistrera pas nécessairement la valeur que la variable avait au moment où vous avez essayé de l'enregistrer. Dans votre cas, les deux appels à console.log() enregistrera la valeur de C après tri.

Si vous essayez d'exécuter le code en question en tant que 5 déclarations séparées dans la console, vous verrez le résultat attendu (premièrement, [2, 1] alors [1, 2] ).

3voto

benipsen Points 162

Bien que cela ne fonctionne pas dans toutes les situations, j'ai fini par utiliser un "point de rupture" pour résoudre ce problème :

mysterious = {property:'started'}

// prints the value set below later ?
console.log(mysterious)

// break,  console above prints the first value, as god intended
throw new Error()

// later
mysterious = {property:'changed', extended:'prop'}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X