Possible Duplicate:
Copying array by value in javascript
i have a funny problem with javascript. i copy an array variable to make modifications on the copy only, then splice the copy to delete an element. however the original array variable is affected by the splice – as if the copy was a ‘copy by reference’:
window.onload = function() {
var initial_variable = ['first', 'second', 'third'];
var copy_initial_variable = initial_variable;
copy_initial_variable.splice(0, 1);
alert('initial variable - ' + initial_variable);
};
//output: initial variable - second,third
firstly, is this intentional behaviour for javascript or is it a bug?
and secondly, how can i make a copy of an array and delete an element in the copy but not in the original?
one thing which makes me think that the above may be a javascript bug is that this behaviour only happens with arrays and not with integers. for example:
window.onload = function() {
var initial_variable = 1;
var copy_initial_variable = initial_variable;
copy_initial_variable = 2;
alert('initial variable - ' + initial_variable);
};
//output: initial variable - 1
if the behaviour were consistent then this ought to output 2 since the assignment would presumably be by reference?
This is in no way a bug, but a very common misunderstanding. Let’s see what happens when I say
Integers and other javascript primitives, like floats and booleans, are “assigned by value”.
Which means that whatever value b has is going to be copied to a. To the computer, it means having the part of memory that b references copied to the memory that a references. That’s the behavior you were expecting.
When arrays and other objects (and “descendants” of a
new Object()call) are used like that, there is a copy by reference. Meaning that the value of a now references the value of b, the memory that b references isn’t copied or modified. Thus, when writingb and a become interchangeable. They’re referencing the same memory address. To achieve what you’re trying to do, use
Read Does JavaScript pass by reference? for more information.