search

Home  >  Q&A  >  body text

Is JavaScript a pass-by-reference or pass-by-value language?

<p>Primitive types (numbers, strings, etc.) are passed by value, but objects are unknown since they can all be passed by value (in which case the variable we think holds the object is actually a reference to an object) and pass-by-reference (when we think of an object's variables as holding the object itself). </p> <p>While it doesn't matter in the end, I'd like to know what is the correct way to present a parameter passing convention. Is there an excerpt from the JavaScript specification that defines the semantics related to this? </p>
P粉450744515P粉450744515464 days ago528

reply all(1)I'll reply

  • P粉231112437

    P粉2311124372023-08-24 14:43:30

    JavaScript is fun. Consider this example:

    function changeStuff(a, b, c)
    {
      a = a * 10;
      b.item = "changed";
      c = {item: "changed"};
    }
    
    var num = 10;
    var obj1 = {item: "unchanged"};
    var obj2 = {item: "unchanged"};
    
    changeStuff(num, obj1, obj2);
    
    console.log(num);
    console.log(obj1.item);
    console.log(obj2.item);

    This produces the output:

    10
    changed
    unchanged
    
    • If obj1 is not a reference at all, changing obj1.item will not have any effect on obj1 outside the function.
    • If the parameters are correct references, then everything changes. num will be 100, and obj2.item will read "changed". Instead, num remains 10 and obj2.item remains "unchanged".

    Instead, the situation is that the incoming item is passed by value. But an item passed by value is itself a reference. Technically, this is called a shared call.

    In practical terms, this means that if you change the parameters themselves (such as num and obj2), it will not affect the input to the scope. However, if you change the inner of the parameter, it will propagate upward (same as obj1).

    reply
    0
  • Cancelreply