Assigning storage to memory is by value, i.e., value is copied over. Assigning memory to storage is also by value, i.e., value is copied over.
uint[] storage storageArray = [1, 2, 3];
uint[] memory memoryArray = storageArray; // value of storageArray is copied over to memoryArray
// modifying memoryArray will not change storageArray
Assigning memory to memory or storage to storage is by reference, i.e., the new variable simply points to the same data location in memory, no copy is created.
uint[] storage pointerArray = storageArray; // [1, 2,3]
pointerArray.push(9); // both point to same array of [1, 2, 3, 9]