How do I pass the value instead of the reference of an array?

you can implement a clone method as follow:

function clone(source) {
    var result = source, i, len;
    if (!source
        || source instanceof Number
        || source instanceof String
        || source instanceof Boolean) {
        return result;
    } else if (Object.prototype.toString.call(source).slice(8,-1) === 'Array') {
        result = [];
        var resultLen = 0;
        for (i = 0, len = source.length; i < len; i++) {
            result[resultLen++] = clone(source[i]);
        }
    } else if (typeof source == 'object') {
        result = {};
        for (i in source) {
            if (source.hasOwnProperty(i)) {
                result[i] = clone(source[i]);
            }
        }
    }
    return result;
};

then:

var b = clone(a);

if you are sure that a is Array, only use Niklas's:

var b = a.slice();

ps: my english is poor:)


I think you can use this to copy the value instead of the reference:

var b = a.slice(0);  

EDIT
As the comments have mentioned and it's also mentioned here: https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/slice

slice does not alter the original array, but returns a new "one level deep" copy that contains copies of the elements sliced from the original array. Elements of the original array are copied into the new array as follows:

  • For object references (and not the actual object), slice copies object references into the new array. Both the original and new array refer to the same object. If a referenced object changes, the changes are visible to both the new and original arrays.

  • For strings and numbers (not String and Number objects), slice copies strings and numbers into the new array. Changes to the string or number in one array does not affect the other array.

If a new element is added to either array, the other array is not affected.


The easiest way i could find is to just make a json string and then parse the data.

var assiging_variable = JSON.parse(JSON.stringify(source_array));

This also works if the source array is a multidimensional array, the array.slice(0) method does not work for multidimensional array.


Yes, that's the way reference assignment works in javascript. You want to clone the object to make a copy, which is unfortunately more involved than it should be. Frameworks like MooTools provide the simplest solution, or you can roll your own clone function.