Desenvolvedor web em Porto Alegre
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.
Comente você também