Do objects pushed into an array in javascript deep or shallow copy?

后端 未结 2 1215
一个人的身影
一个人的身影 2020-11-27 13:02

Pretty self evident question...When using .push() on an array in javascript, is the object pushed into the array a pointer (shallow) or the actual object (deep) regardle

相关标签:
2条回答
  • 2020-11-27 13:40

    jfriend00 is right on the mark here, but one small clarification: That doesn't mean you can't change what your variable is pointing to. That is, y initially references some variable that you put into the array, but you can then take the variable named y, disconnect it from the object that's in the array now, and connect y (ie, make it reference) something different entirely without changing the object that now is referenced only by the array.

    http://jsfiddle.net/rufwork/5cNQr/6/

    var array = [];
    var x = 4;
    var y = {name: "test", type: "data", data: "2-27-2009"};
    
    // 1.) pushes a copy
    array.push(x);
    x = 5;
    document.write(array[0] + "<br>");    // alerts 4 because it's a copy
    
    // 2.) pushes a reference
    array.push(y);
    y.name = "foo";
    
    // 3.) Disconnects y and points it at a new object
    y = {}; 
    y.name = 'bar';
    document.write(array[1].name + ' :: ' + y.name + "<br>");   
    // alerts "foo :: bar" because y was a reference, but then 
    // the reference was moved to a new object while the 
    // reference in the array stayed the same (referencing the 
    // original object)
    
    // 4.) Uses y's original reference, stored in the array,
    // to access the old object.
    array[1].name = 'foobar';
    document.write(array[1].name + "<br>");
    // alerts "foobar" because you used the array to point to 
    // the object that was initially in y.
    
    0 讨论(0)
  • 2020-11-27 13:52

    It depends upon what you're pushing. Objects and arrays are pushed as a pointer to the original object . Built-in primitive types like numbers or booleans are pushed as a copy. So, since objects are not copied in any way, there's no deep or shallow copy for them.

    Here's a working snippet that shows it:

    var array = [];
    var x = 4;
    let y = {name: "test", type: "data", data: "2-27-2009"};
    
    // primitive value pushes a copy of the value 4
    array.push(x);                // push value of 4
    x = 5;                        // change x to 5
    console.log(array[0]);        // array still contains 4 because it's a copy
    
    // object reference pushes a reference
    array.push(y);                // put object y reference into the array
    y.name = "foo";               // change y.name property
    console.log(array[1].name);   // logs changed value "foo" because it's a reference    
    
    // object reference pushes a reference but object can still be referred to even though original variable is no longer within scope
    if (true) {
        let z = {name: "test", type: "data", data: "2-28-2019"};
        array.push(z);
    }
    
    console.log(array[2].name);   // log shows value "test" since the pointer reference via the array is still within scope
    
    0 讨论(0)
提交回复
热议问题