В javascript всё передаётся по значению, но объекты (и массивы) при этом являются как бы «указателями» на настоящий объект, и поэтому изменение внутренностей объекта будет общим; но изнутри функции нельзя приравнять саму переменную уже другому объекту.
В присвоениях и условиях (объекты равны если это тот же самый объект) то же самое. Достаточно один раз понять!
В Delphi специальным синтаксисом (var / out / const) можно заставить компилятор передавать по ссылке, а не по значению.
При этом, фактически там передаётся указатель, а при использовании неявно происходит разыменовывание.
Но некоторые втроенные штуки типа динамических массивов и строк – передаются методом copy-on-write, то есть как бы по значению, но экономно (особенно если всё-таки сделать const).