javascriptarrayspass-by-referencepass-by-value

Swap entire arrays in Javascript


When I try to make a function to swap 2 arrays, the original arrays are left unaltered.

function swap(x, y) {
    var temp = x; x = y; y = temp;
}

u=[1, 0];
v=[0, 1];
swap(u, v);
console.log(u);
console.log(v);

This results in u as [1, 0] and v as [0, 1]. The values haven't been changed after the function call to swap.

On the other hand, if I do this without a function call:

u=[1, 0];
v=[0, 1];
var temp = u;
u = v;
v = temp;
console.log(u);
console.log(v);

Then they're swapped correctly, with u as [0, 1] and v as [1, 0].

I thought Javascript arrays are passed by reference, not by value. Am I misunderstanding something here?


Solution

  • They are passed by reference, but they are also assigned by reference. When you write x = y you aren't modifying either of the arrays, you're just making your local variable x refer to the same array as y.

    If you want to swap the array contents, you have to modify the arrays themselves:

    function swap(x,y) {
        var temp = x.slice(0);
        x.length = 0;
        [].push.apply( x, y );
        y.length = 0;
        [].push.apply( y, temp ); 
    }