when you assign an object (not a primitive) to a variable (or a property of another object) then you are assigning a reference to the object. The variable only stores the reference to the object. The object is stored in memory, and can be referenced by many variables, as im sure you know. If you use methods on the referenced object then you will mutate it (possibly - depending on the method). So, in the case of using push/pop on an array, they mutate the array, by adding/removing items.
This is the same for any instance of object (instance of class if you want to think classically), that you create. You can mutate it however you want, you can assign new properties/methods (objects are dynamic), or mutate it in any way you want. aslong as you are working ON the reference.
eg:
var obj = {};
obj.one = 1; // mutating obj
obj.test = function() {} // mutating obj
var obj2 = obj; // another reference to the 'obj' object
obj = {} // creating a new empty object and assigning a reference to it under the variable 'obj'
obj2.one // still exists and == 1, as the object created initially still exists and is referenced by the obj2 variable.
obj2 = 2 // reassigning the variable obj2 to a primitive value of '2'
// now there are no references to the object that was previously assigned to obj1 and obj2, therefore it will be cleaned up by garbage collection (removed from memory)
hope that helps