Copie par valeur, copie par référence

introduction

En guise d’introduction, veuillez suivre les instructions suivantes :

partie 1

// créez une variable « a » initialisée à 10
var a = 10

// crééz une variable « b » initialisée avec « a »
var b = a

// modifiez la valeur de « a »
var a = 20

// quelle est selon vous la valeur de « b » à ce stade ?

partie 2

// créez une variable « a » initialisée avec un objet vide
var a = {}

// crééz une variable « b » initialisée avec « a »
var b = a

// modifiez l'objet associé à « a »
// on lui ajoute une propriété qqch
// ayant comme valeur 10
a.qqch = 10

// quelle est selon vous la valeur de « b » à ce stade ?

Que s’est-il passé ?

Dans le cas de valeurs primitive, est effectué ce que l’on appelle une « copie par valeur » : on copie la valeur contenu en mémoire.

Dans le second cas, il s’agit d’une « copie par référence », on copie la référence vers l’espace en mémoire. Les deux variables pointent alors vers la même valeur.

Pas à pas (version complète)

étape 1

// on créé une variable a
// elle n'est pas initialisée
// sa valeur est donc undefined
var a
étape 2

// on initialise a avec la valeur 10
a = 10
étape 3

// on créé la variable b
// elle n'est pas initialisée
// sa valeur est undefined
var b
étape 4

// on assigne à b la valeur de a
var b = a
étape 5

// on créé un objet c
// avec une propriété valeur égale à 10
var c = { valeur : 10 }
étape 6

// on créé la variable d
// elle n'est pas initialisée
// sa valeur est undefined
var d
étape 7

// on assigne à d la *référence* de c
d = c
étape 8

Conclusion

Gardez en tête l’existence de ces deux modes de copie : la copie par valeur et la copie par référence.