{...obj} crée un nouvel objet, mais ne copie que les propriétés propres énumérables de premier niveau. C’est donc une copie superficielle (shallow copy).

Si une propriété contient un objet ou un tableau, sa valeur est une référence vers celui-ci. Le spread recopie cette référence, sans cloner récursivement l’objet imbriqué :

const original = {
nom: "Alice",
adresse: { ville: "Paris" }
};

const copie = { ...original };

console.log(copie !== original); // true
console.log(copie.adresse === original.adresse); // true

copie.adresse.ville = "Lyon";
console.log(original.adresse.ville); // "Lyon"

L’objet racine est distinct, mais adresse reste partagé. En revanche, remplacer entièrement une propriété de premier niveau n’affecte pas l’original :

copie.nom = "Bob";
console.log(original.nom); // "Alice"

Pour une copie profonde compatible avec l’algorithme de clonage structuré, on peut utiliser :

const copieProfonde = structuredClone(original);

structuredClone gère notamment les cycles, Date, Map et Set, mais ne clone pas les fonctions et ne préserve pas nécessairement les prototypes personnalisés.