Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

splice is affecting previously copied variables [duplicate]

Tags:

javascript

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?

like image 678
mulllhausen Avatar asked Jan 05 '13 08:01

mulllhausen


2 Answers

This is in no way a bug, but a very common misunderstanding. Let's see what happens when I say

var a = b;

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 writing

a = [1,2,3];
b = a;

b and a become interchangeable. They're referencing the same memory address. To achieve what you're trying to do, use

var copy_initial_variable = initial_variable.slice(0);

Read Does JavaScript pass by reference? for more information.

like image 183
FRD Avatar answered Oct 12 '22 23:10

FRD


In first case you are working with arrays, which are passed by reference. And in second case you are working with prime types which are passed by value. In first case you should copy initial array (e.g. with initial_variable.slice(0)). Try something like

window.onload = function() {
  var initial_variable = ['first', 'second', 'third'];
  var copy_initial_variable = initial_variable.slice(0); //returns new array!!!!
  copy_initial_variable.splice(0, 1);
  alert('initial variable - ' + initial_variable);
};
like image 26
Eugeny89 Avatar answered Oct 13 '22 00:10

Eugeny89