I came across a somewhat less common programming term:
Call-By-SharingOne characterization is:
Call-by-value, but object variables are understood to contain a reference to the actual object.
If you mutate a passed object, the change is seen by the caller. If you re-assign a value to a passed variable, it is not seen by the caller.
Python examples from the Wikipedia article:
Mutation is seen by caller:
def f(l):
l.append(1)
m = []
f(m)
print(m)
Re-assignment is not seen by caller:
def f(l):
l = [1]
m = []
f(m)
print(m)
Applies to:
Python, Iota, Java (for object references), Ruby, JavaScript, Scheme, OCaml, AppleScript, and many others
Another characterization:
Primitive values use pass-by-value, while object variables use pass-by-reference.
Despite the name, for C++, this is more like pointer syntax than reference syntax. If you assigned to a reference (after the initial assignment that sets the address/object identity), it will copy over the original object. If you assign to a pointer, the pointer now holds a new distinct object, and the old object continues to exist in memory.
#include <iostream>
void f(int a, int& b, int* c, int* d)
{
a = 5;
Edit:
There is also this nicely answered question on StackOverflow for JavaScript:
Is JavaScript a Pass-By-Reference or Pass-By-Value Language?