structuredClone()
Crée une copie profonde d’une valeur, y compris les objets imbriqués, les dates, les Map et les Set.
- Renvoie
- Une copie profonde de la valeur donnée.
- Modifie l’original
- Non
Exemple
#const original = {
name: 'Léa',
progress: { html: 80, css: 40 },
badges: ['Start']
}
const copy = structuredClone(original)
copy.progress.html = 100
copy.badges.push('Série de 7 jours')
console.log(original.progress.html, original.badges)
console.log(copy.progress.html, copy.badges)Définition et utilisation
#La fonction structuredClone() crée une copie complète et profonde de la valeur donnée. Contrairement à la syntaxe { ...obj } ou à Object.assign(), qui ne copient que le premier niveau, elle copie aussi tous les objets et tableaux imbriqués. Modifier la copie n’affecte donc pas l’original.
Elle gère plus de types que l’astuce JSON.parse(JSON.stringify(obj)) : elle conserve les dates comme objets Date, et copie Map, Set, les expressions régulières, les tableaux typés et les valeurs undefined. Elle gère aussi correctement les objets qui se référencent eux-mêmes.
Elle a aussi des limites. Impossible de cloner des fonctions ou des éléments du DOM (cela déclenche une DataCloneError), et les instances de classes perdent leur prototype pour devenir de simples objets ne contenant que les données.
Syntaxe
#structuredClone(value)
structuredClone(value, { transfer })Paramètres
#value
n’importe quelle valeur
La valeur à copier : un objet, un tableau, une date, uneMap, unSet, etc.options
objet optionnel
Un objet avec un champtransfer, une liste d’objets (par ex.ArrayBuffer) à déplacer plutôt qu’à copier.
Plus d’exemples
#const course = { title: 'JS', stats: { students: 120 } }
const shallow = { ...course }
const deep = structuredClone(course)
shallow.stats.students = 200
console.log(course.stats.students)
console.log(deep.stats.students)const session = {
startedAt: new Date(Date.UTC(2026, 8, 28, 10, 30)),
answers: new Map([['q1', 'B']])
}
const viaJson = JSON.parse(JSON.stringify(session))
const cloned = structuredClone(session)
console.log(typeof viaJson.startedAt, viaJson.answers)
console.log(cloned.startedAt.getUTCHours(), cloned.answers.get('q1'))try {
structuredClone({ name: 'Quiz', start() {} })
} catch (error) {
console.log(error.name)
}Compatibilité des navigateurs
#Largement disponible · depuis 2022
Fonctionne dans tous les navigateurs modernes, y compris sur mobile. Vous pouvez l’utiliser sans crainte.
- Chrome
- Edge
- Firefox
- Safari
Bonnes pratiques
#- Pour copier des données avec des objets imbriqués, utilisez
structuredClone()plutôt queJSON.parse(JSON.stringify()). - Si un objet contient des méthodes ou est une instance de classe, clonez seulement les données, ou écrivez votre propre méthode de copie.
- Quand une copie du premier niveau suffit, la syntaxe
{ ...obj }est plus simple et plus rapide.
Entrées associées
#- Object.assign()Copie les propriétés d’un ou plusieurs objets vers un objet cible.
- Spread (...)La syntaxe spread décompose un tableau, une chaîne ou un objet en éléments individuels : pour copier, fusionner et passer des arguments.
- JSON.stringify()Transforme une valeur JavaScript, comme un objet ou un tableau, en chaîne de caractères au format JSON.
- JSON.parse()Transforme une chaîne de caractères au format JSON en valeur JavaScript, comme un objet ou un tableau.
- MapUne collection de paires clé-valeur dans laquelle la clé peut être n’importe quelle valeur, et où l’ordre d’ajout est conservé.
Vous voyez une erreur ou il manque un exemple ? Écrivez-nous.