Pass by Value is to copy data from an existing variable into a new one. Changes made to the new variable will not be reflected in the first.
Pass by Reference is to create a new variable that references an existing variable. The new variable is only a pointer to the old, and any changes made to either will reflect in both.
If you want to duplicate a complex data type, there are a few ways to make sure your are passing by value and not by reference. One way is to create a new structure and pass into it all of the data from the other using the spread operator.