Domanda

Ecco un codice che ha due array (np e op), uno una copia dell'altro

Tuttavia, quando modifico la copia, anche l'originale viene modificato! dai un'occhiata:

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

Esiste un modo per conservare l'originale e modificare la copia?

È stato utile?

Soluzione

Non hai mai fatto una copia dell'array. Hai semplicemente assegnato l'array a un'altra variabile. Questo non viene copiato in Javascript. Nel tuo esempio c'è un solo array con due variabili con cui puoi accedervi. Non esiste un modo integrato per copiare le matrici in Javascript, quindi è necessario scrivere la propria funzione per farlo.

Dai un'occhiata a questa domanda StackOverflow per un suggerimento su come implementare effettivamente la copia degli elementi nell'array.

Altri suggerimenti

Alcune delle funzioni di array incorporate creeranno effettivamente una copia per te. Uno di questi è slice.

Ad esempio:

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

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

Quello che stai facendo non è creare una copia dell'array, ma solo creare una copia del riferimento all'array, in modo da ottenere due riferimenti allo stesso oggetto array.

Ecco come è possibile creare una copia effettiva dell'array:

var np = op.concat();

Il metodo concat crea un nuovo array che è una copia dell'array con eventuali elementi aggiuntivi aggiunti. Se non si specifica alcun elemento aggiuntivo, si ottiene semplicemente una copia dell'array.

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

Poi


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

Dovresti clonare il secondo array invece di copiarlo.

--- Aggiorna

Se si assegna un oggetto a una variabile, viene copiato solo il riferimento (ciò significa che entrambi puntano agli stessi dati). Per avere una copia indipendente di questo oggetto è necessario clonarlo. E ci sono diversi modi per farlo, ad esempio qui è il modo di clonare l'oggetto usando jQuery.

Puoi semplicemente usare il metodo nativo slice che restituisce una copia dell'array:

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

Il secondo parametro dovrebbe essere facoltativo, ma in IE credo che sia necessario.

Il tuo codice, completo di modifica:

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

Per creare un nuovo array potresti prendere in considerazione:

   var op = [];

Per copiare un array:

var np=op.slice();

o

var np=op.concat();

concat è più veloce, mentre lo slice occupa un carattere in meno. Alcune persone alias " slice " o " concat " come " copia " quindi è più ovvio che ne stai facendo una copia.

Non sono necessari parametri in entrambi i casi. I parametri nella sezione renderanno il codice più grande e più lento.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top