Do objects pushed into an array in javascript deep or shallow copy?
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 4array.push(x); // push value of 4x = 5; // change x to 5console.log(array[0]); // array still contains 4 because it's a copy// object reference pushes a referencearray.push(y); // put object y reference into the arrayy.name = "foo"; // change y.name propertyconsole.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 scopeif (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
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 copyarray.push(x);x = 5;document.write(array[0] + "<br>"); // alerts 4 because it's a copy// 2.) pushes a referencearray.push(y);y.name = "foo";// 3.) Disconnects y and points it at a new objecty = {}; 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.