Pergunta

Aqui está um código que tem duas matrizes (np e op), uma cópia do outro

No entanto, quando eu modificar a cópia, o original também é modificado! dar uma olhada:

<script type="text/javascript">
var op=new Array(0, 0);
var np=op;
np[1]=2;
document.write(op+"<br>")
document.write(np)
</script>

Existe alguma maneira de manter o original e modificar a cópia?

Foi útil?

Solução

Você nunca fez uma cópia da matriz. Você simplesmente atribuído a matriz para outra variável. Isso não copiar em Javascript. No seu exemplo só há uma matriz com duas variáveis ??pelo qual você pode acessá-lo. Não há como built-in maneira de copiar matrizes em Javascript, assim você terá que escrever sua própria função para fazê-lo.

Dê uma olhada este StackOverflow pergunta para uma dica sobre como aplicar na prática a cópia dos elementos na matriz.

Outras dicas

Alguns dos construído em funções de matriz vai realmente criar uma cópia para você. Um desses é fatia.

Por exemplo:

var op=new Array(0, 0);
var np= op.slice(0);
np[1]=2;
document.write(op+"<br>")
document.write(np)

http://my.opera.com/GreyWyvern/blog/ show.dml / 1725165

O que você está fazendo não está criando uma cópia da matriz, é só criar uma cópia da referência para a matriz, de modo a obter duas referências para o mesmo objeto array.

Isto é como você pode criar uma cópia real do array:

var np = op.concat();

O método concat cria uma nova matriz que é uma cópia do array com todos os itens adicionais adicionados. Se você não especificar quaisquer itens adicionais que você acabou de obter uma cópia da matriz.

Array.prototype.copy = function() {
    return this.slice(0, this.length);
  }

Em seguida,


var op=new Array(0, 0);
var np=op.copy();
np[1]=2;
document.write(op+"<br>")
document.write(np)

Você deve clonar a segunda matriz em vez de copiá-lo.

--- Atualização

Se você atribuir um objeto a uma variável, apenas a referência é copiada (o que significa, ambos apontam para a mesma data). Para ter uma cópia independente do objeto que você precisa para cloná-lo. E existem várias maneiras como esta, por exemplo aqui é a maneira de clonar objeto usando jQuery.

Você pode apenas usar o método slice nativa que retorna uma cópia da matriz:

var np = op.slice(0,op.length);

O segundo parâmetro deve ser opcional, mas no IE Eu acredito que é necessário.

O seu código, com a mudança:

var op=new Array(0, 0);
var np=op.slice(0,op.length);
np[1]=2;
document.write(op+"<br>")
document.write(np)

Para criar uma nova matriz que você pode querer considerar:

   var op = [];

Para copiar um array:

var np=op.slice();

ou

var np=op.concat();

concat é mais rápido, enquanto fatia ocupa menos um personagem. Algumas pessoas pseudônimo "fatia" ou "concat" como "cópia" de modo que é mais óbvio que você está fazendo uma cópia.

Não há necessidade de parâmetros em ambos os casos. Parâmetros na fatia fará apenas o código maior e mais lento.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top