Vanilla JS :
Réponse de @evan semble être la meilleure solution. Il suffit d'utiliser JSON.parse/stringify pour faire une copie de l'objet.
console.log(JSON.parse(JSON.stringify(test)));
Solution spécifique à JQuery :
Vous pouvez créer un instantané d'un objet à un moment donné à l'aide de la fonction jQuery.extend
console.log($.extend({}, test));
Ce qui se passe ici, c'est que jQuery crée un nouvel objet avec l'attribut test
et l'enregistre (pour qu'il ne change pas).
Solution spécifique AngularJS (1) :
Angular fournit une fonction copy
qui peut être utilisée pour le même effet : angular.copy
console.log(angular.copy(test));
Fonction enveloppante de JS Vanilla :
Voici une fonction qui enveloppe console.log
mais fera une copie de tous les objets avant de les déconnecter.
J'ai écrit cette fonction en réponse à quelques fonctions similaires mais moins robustes dans les réponses. Elle prend en charge plusieurs arguments et no essayer de copier des choses qui ne le sont pas régulière objets.
function consoleLogWithObjectCopy () {
var args = [].slice.call(arguments);
var argsWithObjectCopies = args.map(copyIfRegularObject)
return console.log.apply(console, argsWithObjectCopies)
}
function copyIfRegularObject (o) {
const isRegularObject = typeof o === 'object' && !(o instanceof RegExp)
return isRegularObject ? copyObject(o) : o
}
function copyObject (o) {
return JSON.parse(JSON.stringify(o))
}
exemple d'utilisation : consoleLogWithObjectCopy('obj', {foo: 'bar'}, 1, /abc/, {a: 1})
2 votes
Jsfiddle exemple du problème et diverses solutions données ci-dessous : jsfiddle.net/luken/M6295
12 votes
Il est extrêmement contre-intuitif pour le journal afin d'obtenir une référence vivante à l'objet. C'est ce qu'on appelle un regarder ce qui est très différent d'une entrée de journal. Cela n'a pas plus de sens de faire cela lors de l'enregistrement d'un objet que lors de l'enregistrement d'une variable stockant une valeur primitive.
3 votes
Comment se fait-il que je n'aie jamais rencontré cela auparavant ? Je trouve cela effrayant