It is always pass by value. Values of arguments are always copied and sent to the function.
The "value" of an object is the reference. This is why it seems like it's pass-by-reference but JS does not support pass-by-reference.
Yes, you can mutate the object from within the function, but you cannot change the reference.
var x = { /* some obj */ };
var y = x;
foo(x);
// no matter what foo does, the following will be true. You cannot make x reference any other object.
x === y
x is not the object. x is not the object.
When you call a function with x, you aren't passing x. You're passing the value of x. The value of x happens to be a reference to an object.
Pass-by-value by copying a reference is NOT pass-by-reference.
Agree with above of course. Just want to point out to people coming from a C# world that for instance structs in C# are passed by value. You get a copy of an object with all of its members also copied. It ends up on the stack. class instances are passed by "a copy of a reference" if you like often short-handed to "passed by reference". In Javascript only primitives are passed by copying the pure value, objects are always a copy of a reference.
Correct. structs in several languages behave similarly (C, Go, Crystal). The cost of copying becomes larger as the struct becomes larger, which is where pointers come in. Then references were made as a safer alternative to pointers. (obviously glossing over details here)
By the way, I think you mean instances when you wrote "classes are passed by "a copy of a reference""
In the end it all comes down to knowing how pointers work. So many programmers think that if they're not coding in C or C++ then they can just not learn how pointers work since they're dealing with """references"""
Knowing what is exactly copied is incredibly important in every language.
Valentin, thank you for the correction and the detailed articles!
The mental model I've had that "primitives are passed by value; objects are passed by reference" has served me well over the years, and it's been helpful in understanding what behavior to expect, but it appears that I've been using the incorrect terms to explain what's really going on underneath the hood.
I've read through all your linked references. Just for my understanding, it seems like the following statement from the Stack Overflow answer is an appropriate way to explain the concept, right?
Primitives are passed by value. Objects are passed by "copy of a reference".
Or as you've said:
It is always pass by value. The "value" of an object is the reference.
For further actions, you may consider blocking this person and/or reporting abuse
We're a place where coders share, stay up-to-date and grow their careers.
Sorry, this is wrong.
It is always pass by value. Values of arguments are always copied and sent to the function.
The "value" of an object is the reference. This is why it seems like it's pass-by-reference but JS does not support pass-by-reference.
Yes, you can mutate the object from within the function, but you cannot change the reference.
x
is not the object.x
is not the object.When you call a function with
x
, you aren't passing x. You're passing the value of x. The value of x happens to be a reference to an object.Pass-by-value by copying a reference is NOT pass-by-reference.
Pass-by-reference is a concept/feature that (effectively) only exists in C++: learncpp.com/cpp-tutorial/73-passi...
Sources:
Agree with above of course. Just want to point out to people coming from a C# world that for instance
structs
in C# are passed by value. You get a copy of an object with all of its members also copied. It ends up on the stack.class instances
are passed by "a copy of a reference" if you like often short-handed to "passed by reference". In Javascript only primitives are passed by copying the pure value, objects are always a copy of a reference.Correct.
structs
in several languages behave similarly (C, Go, Crystal). The cost of copying becomes larger as the struct becomes larger, which is where pointers come in. Then references were made as a safer alternative to pointers. (obviously glossing over details here)By the way, I think you mean
instances
when you wrote "classes
are passed by "a copy of a reference""In the end it all comes down to knowing how pointers work. So many programmers think that if they're not coding in C or C++ then they can just not learn how pointers work since they're dealing with """references"""
Knowing what is exactly copied is incredibly important in every language.
Ooops... Quite right, instances of classes.
Valentin, thank you for the correction and the detailed articles!
The mental model I've had that "primitives are passed by value; objects are passed by reference" has served me well over the years, and it's been helpful in understanding what behavior to expect, but it appears that I've been using the incorrect terms to explain what's really going on underneath the hood.
I've read through all your linked references. Just for my understanding, it seems like the following statement from the Stack Overflow answer is an appropriate way to explain the concept, right?
Or as you've said: