Aqui vai uma “diquinha básica”.

Você está todo contente fazendo seu código JavaScript. Por alguma razão, no seu algoritmo, você tem que fazer uma cópia de um array todo. E vai bem contente fazer…

var original = [1,2,3,4,5];
var novo = original;
novo[0] = 999;
alert(original[0]);

…e acaba ficando com cara de tacho quando uma janelinha com o número 999 aparece.

Quando você usa o operador “=” no JavaScript, para objetos e arrays, na verdade está criando uma nova referência para O MESMO objeto. É como um ponteiro em C. Ruby também é assim. Uma penca de linguagens é assim. No exemplo acima, “novo” e “original” são efetivamente o mesmo array. Ao alterar um, o outro também é alterado, pois são o mesmo. Dois nomes para a mesma área de memória. Dois ponteiros iguais. Duas metades da mesma laranja. Dois… ah já entendeu.

Bem, e se eu quiser fazer uma cópia, e não uma nova referência? Aí depende.

JavaScript NÃO tem função de clonagem padrão na própria linguagem. Mas pode-se usar uma malandragem, se o alvo da cópia for um array (como no exemplo acima). Veja a malandragem a seguir.

var original = [1,2,3,4,5];
var novo = [].concat(original);
novo[0] = 999;
alert(original[0]);

Viva! A janelinha mostra o número 1, como queríamos. O que fizemos na linha

var novo = [].concat(original);

foi criar um array novo e vazio ([]), e concatenar a este array os elementos do outro com a função concat. Isso gera um novo array como esperado, e não uma referência ao “original”.

Já quanto a clonar objetos, sinto, mas não tem uma malandragem curta e óbvia como essa. Você tem de criar sua própria função de clonagem. Pesquise por “javascript” e “clone” que você encontrará um bom número de implementações diferentes, curtas e longas, e então eleja sua favorita.