Parameters are Reference Variables
Level: Advanced
JavaScript doesn’t support reference variables - variables that, when assigned, also apply their assignment to the variable that they reference (not to be confused with JavaScript object references). In C++, for example, you can specify a reference variable using &
.
// C++
int main() {
int x = 1;
int& y = x;
y = 2;
std::cout << x; // 2
}
There is, however, a weird quirk in JavaScript where you can see reference variable-like behavior at work. This happens with function parameters and the arguments
object. In the right circumstances, if you redefine a function parameter, the arguments
object will also reflect that changed value and vice versa.
// JavaScript
function showRefs (a, b) {
console.log(arguments); // [1, 2]
a = 3;
b = 4;
console.log(arguments); // [3, 4]
arguments[0] = 5;
arguments[1] = 6;
console.log(a, b); // 5, 6
}
showRefs(1, 2);
This is not a behavior you should depend on. In fact, it does not occur in strict mode or when there’s anything fancy happening in the parameter list such as default parameters or a ...rest
parameter. But, if you are using the arguments
object, it’s something to be conscious of, especially if you’re modifying parameter variables or mutating arguments
(which you probably shouldn’t be doing anyway).
More info: