Pregunta

Aquí hay un código que tiene dos matrices (np y op), una copia del otro

Sin embargo, cuando modifico la copia, ¡el original también se modifica! echa un vistazo:

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

¿Hay alguna forma de conservar el original y modificar la copia?

¿Fue útil?

Solución

Nunca hiciste una copia de la matriz. Simplemente asignó la matriz a otra variable. Esto no se copia en Javascript. En su ejemplo, solo hay una matriz con dos variables mediante las cuales puede acceder a ella. No hay una forma integrada de copiar matrices en Javascript, por lo que deberá escribir su propia función para hacerlo.

Eche un vistazo a esta pregunta de StackOverflow para obtener una pista sobre cómo implementar realmente la copia de los elementos en la matriz.

Otros consejos

Algunas de las funciones integradas de Array crearán una copia para usted. Uno de ellos es el corte.

Por ejemplo:

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

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

Lo que está haciendo no es crear una copia de la matriz, solo está creando una copia de la referencia a la matriz, por lo que obtiene dos referencias al mismo objeto de matriz.

Así es como puede crear una copia real de la matriz:

var np = op.concat();

El método concat crea una nueva matriz que es una copia de la matriz con cualquier elemento adicional agregado. Si no especifica ningún elemento adicional, solo obtendrá una copia de la matriz.

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

Entonces


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

Debería clonar la segunda matriz en lugar de copiarla.

--- Actualizar

Si asigna un objeto a una variable, solo se copia la referencia (es decir, ambos apuntan a los mismos datos). Para tener una copia independiente de este objeto, debe clonarlo. Y hay varias formas de hacerlo, por ejemplo aquí es la forma de clonar objetos usando jQuery.

Puede usar el método nativo slice que devuelve una copia de la matriz:

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

El segundo parámetro debería ser opcional, pero en IE creo que es obligatorio.

Su código, complete con el cambio:

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

Para crear una nueva matriz, es posible que desee considerar:

   var op = [];

Para copiar una matriz:

var np=op.slice();

o

var np=op.concat();

concat es más rápido, mientras que el corte ocupa un carácter menos. Algunas personas alias " slice " o "concat" como " copia " para que sea más obvio que estás haciendo una copia.

No hay necesidad de parámetros en ninguno de los casos. Los parámetros en el segmento solo harán que el código sea más grande y lento.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top