Kun JavaScriptissä kopioidaan matriisia toiseen matriisiin:
var arr1 = ['a','b','c'];
var arr2 = arr1;
arr2.push('d'); //Now, arr1 = ['a','b','c','d']
Huomasin, että arr2
viittaa samaan arrayyn kuin arr1
, eikä uuteen, itsenäiseen arrayyn. Miten voin kopioida arraya, jotta saisin kaksi itsenäistä arraya?
Käytä tätä:
var newArray = oldArray.slice();
Periaatteessa operaatio slice()
kloonaa joukon ja palauttaa viittauksen uuteen joukkoon.
Viittausten, merkkijonojen ja numeroiden (eikä varsinaisen objektin) osalta slice()
kopioi objektiviittaukset uuteen arrayyn. Sekä alkuperäinen että uusi array viittaavat samaan objektiin. Jos viitattu objekti muuttuu, muutokset näkyvät sekä uudessa että alkuperäisessä ruudussa.
Primitiivit, kuten merkkijonot ja numerot, ovat muuttumattomia, joten muutokset merkkijonoon tai numeroon ovat mahdottomia.
JQuerya ei tarvita... [Toimiva esimerkki][1]
var arr2 = arr1.slice()
Tämä kopioi sarjan aloituspaikasta 0
sarjan loppuun asti.
On tärkeää huomata, että se toimii odotetusti primitiivisille tyypeille (merkkijono, luku jne.), ja selittää myös odotettu käyttäytyminen viittaustyypeille...
Jos sinulla on joukko viitetyyppejä, esimerkiksi tyyppiä Object
. Joukko kopioidaan, mutta molemmat joukot sisältävät viittauksia samoihin Object
'iin. Joten tässä tapauksessa näyttäisi siltä, että matriisi kopioidaan viitteellä, vaikka matriisi todellisuudessa kopioidaan.
Jos haluat tehdä uuden kopion objektista tai joukosta, sinun on kopioitava nimenomaisesti esimerkiksi objektin ominaisuudet tai joukon elementit:
var arr1 = ['a','b','c'];
var arr2 = [];
for (var i=0; i < arr1.length; i++) {
arr2[i] = arr1[i];
}
Voit hakea Googlella lisätietoja muuttumattomista primitiivisistä arvoista ja muuttuvista objektiviittauksista.