recherche

Maison  >  Questions et réponses  >  le corps du texte

La modification d'une copie d'un objet JavaScript entraîne la modification de l'objet d'origine

<p>Je copie <code>objA</code> dans <code>objB</code></p> <pre class="brush:php;toolbar:false;">const objA = { prop: 1 }, const objB = objA ; objB.prop = 2; console.log(objA.prop); // enregistre 2 au lieu de 1</pre> <p>Les tableaux ont également le même problème</p> <pre class="brush:php;toolbar:false;">const arrA = [1, 2, 3], const arrB = arrA; arrB.push(4); console.log(arrA.length); // `arrA` a 4 éléments au lieu de 3.</pre> <p><br /></p>
P粉765684602P粉765684602464 Il y a quelques jours499

répondre à tous(2)je répondrai

  • P粉394812277

    P粉3948122772023-08-28 17:35:35

    Pour résumer, juste pour clarifier, il existe quatre façons de copier un objet JS.

    1. Copie normale. Lorsque vous modifiez les propriétés de l'objet d'origine, les propriétés de l'objet copié changent également (et vice versa).
    const a = { x: 0}
    const b = a;
    b.x = 1; // also updates a.x
    
    1. Copie superficielle. Les propriétés de niveau supérieur des objets originaux et copiés seront uniques. Toutefois, les propriétés imbriquées seront partagées entre les deux objets. Utilisez l'opérateur de spread ...{}Object.assign().
    const a = { x: 0, y: { z: 0 } };
    const b = {...a}; // or const b = Object.assign({}, a);
    
    b.x = 1; // doesn't update a.x
    b.y.z = 1; // also updates a.y.z
    
    1. Copie approfondie. Toutes les propriétés sont uniques aux objets d'origine et copiés, même les propriétés imbriquées. Pour une copie complète, sérialisez l'objet en JSON et analysez-le à nouveau dans un objet JS.
    const a = { x: 0, y: { z: 0 } };
    const b = JSON.parse(JSON.stringify(a)); 
    
    b.y.z = 1; // doesn't update a.y.z
    
    1. Copie complète complète. En utilisant la technique ci-dessus, les valeurs de propriété non valides (telles que les fonctions) dans JSON sont ignorées. Si vous avez besoin de copier en profondeur et de conserver les propriétés imbriquées contenant des fonctions, vous souhaiterez peut-être consulter une bibliothèque d'utilitaires comme lodash .
    import { cloneDeep } from "lodash"; 
    const a = { x: 0, y: { z: (a, b) => a + b } };
    const b = cloneDeep(a);
    
    console.log(b.y.z(1, 2)); // returns 3
    
    1. Utilisez Object.create()确实创建了一个新对象。这些属性在对象之间共享(更改其中一个也会更改另一个)。与普通副本的区别在于,属性被添加到新对象的原型 __proto__ ci-dessous. Cela peut également être utilisé comme une copie superficielle lorsque vous jamais modifiez l'objet d'origine, mais je vous recommande d'utiliser l'une des méthodes ci-dessus, sauf si vous avez spécifiquement besoin de ce comportement.

    répondre
    0
  • P粉520545753

    P粉5205457532023-08-28 12:57:02

    De toute évidence, vous avez un malentendu sur ce que fait la déclaration var tempMyObj = myObj;.

    En JavaScript, les objets sont passés et alloués par référence (plus précisément, la valeur de la référence), donc tempMyObjmyObj sont toutes des références au même objet.

    Voici une illustration simplifiée pour vous aider à visualiser ce qui se passe

    // [Object1]<--------- myObj
    
    var tempMyObj = myObj;
    
    // [Object1]<--------- myObj
    //         ^ 
    //         |
    //         ----------- tempMyObj

    Comme vous pouvez le voir après le devoir, les deux références pointent vers le même objet.

    Si vous devez modifier l'un mais pas l'autre, vous devez créer une copie.

    // [Object1]<--------- myObj
    
    const tempMyObj = Object.assign({}, myObj);
    
    // [Object1]<--------- myObj
    // [Object2]<--------- tempMyObj

    Ancienne réponse :

    Voici quelques autres façons de créer des copies d'objets

    Puisque vous utilisez déjà jQuery :

    var newObject = jQuery.extend(true, {}, myObj);

    Utilisez du JavaScript simple

    function clone(obj) {
        if (null == obj || "object" != typeof obj) return obj;
        var copy = obj.constructor();
        for (var attr in obj) {
            if (obj.hasOwnProperty(attr)) copy[attr] = obj[attr];
        }
        return copy;
    }
    
    var newObject = clone(myObj);

    Voir ici et ici

    répondre
    0
  • Annulerrépondre