DEV Community

Discussion on: Weird behaviors of javascript: Primitive Types and Reference Types

 
pentacular profile image
pentacular

Ok, so we can all agree that it is pass by value.

And that there is no pass by reference happening anywhere here.

Which means that what we're passing is the value of the object.

All well and good.

Can you show me where it says that object values are references, in the ecmascript standard?

I'm having trouble finding support for that claim.

Thread Thread
 
willsmart profile image
willsmart

JS always passes function args by value.

const a = something
function foo(value) {codez}
foo(a) // <= this could never change the type of a, since foo never sees a itself, just its value

function bar(pram) {
  pram.baz = 1 // <= this isn't mutating pram, but the details of the object pram refers to.
  pram = 1 // <= this mutates pram itself. Were it pass-by-reference then the argument to the function in the caller scope would now read as 1, because it's the thing we just set to 1
} 

But, the "value" of a variable for a JS object is a reference to the underlying object.
This is the same with strings, but they're immutable so their references cause less confusion

const a = "hi"
const b = "hi"
// a and b are two values that refer to the one common string in memory
a = "bye"
// reassigning a doesn't change b

So, functions pass by value, but in many cases that value is just a reference to some common structure.

Thread Thread
 
pentacular profile image
pentacular

I'm glad we can all agree that javascript doesn't support pass by reference.

Now, could you show me where in the ecmascript standard it talks about an object value being a reference?

Thread Thread
 
danielw profile image
Daniel Waller (he/him)

Hey man, just some feedback on your conversational style:
I find it's quite confrontational and irritating to read.
To me it feels like your trying to score internet points for being right and aren't actually interested in explaining things to people.
It reads more like a Twitter or Reddit thread and I was always very happy to see a calmer more constructive and friendly style on here.

I really don't mean this as a personal attack, I just feel the conversation could have a lot more merit to others (especially newcomers) if it were more constructive.

Thread Thread
 
pentacular profile image
pentacular • Edited

Could you be more specific about the confrontational style that you perceive?

Thread Thread
 
willsmart profile image
willsmart

A bit of constructive editing...

I'm glad we can all agree that javascript doesn't support pass by reference.

Now, could you show me where in the ecmascript standard it talks about an object value being a reference?

vvvvvv

(First para deleted)

What do you mean that object values are references? I've been fishing through the spec (ecma-international.org/ecma-262/11...) and can't find anything saying so.

Same info and questions, but the second one is showing you're willing to put in some work to find your answer, that we probably fundamentally agree but are stuck on terminology, and will ultimately avoid nag replies like this.
If the language doesn't come naturally to you, try your best to fake it til you make it.

I had a squiz at the spec, couldn't find a specific mention, and ran out of motivation to dig further. The proof though is

a = {}
b = a
a.foo = 1
console.log(b.foo) // <- prints "1"

For a time, the values of a and b refer to the same object. They hold two pointer-like structures that reference the same shared underlying object. In programming this is often called a reference.

Thread Thread
 
willsmart profile image
willsmart

I'm signing off the thread btw

Thread Thread
 
pentacular profile image
pentacular • Edited

That's fine, but for future reference, let's note that a.foo doesn't mean that a is a reference.

It does mean that a and b have the same value, and it does mean that that value is used to find a particular property named 'foo' and modify that.

Which makes me think that all of this 'reference' stuff is something someone made up to try to explain javascript in terms of a language with references, like C++, but which doesn't quite fit.