Hvad angår dit spm. om hvordan de gemmes. Jeg har lavet et lille eksempel og testet lidt på det. Først to objekter til storage og en objekt constructor:
var oList_A = {};
var oList_B = {};
function MyObj(nInx, nSome) {
this.id = "ID:"+nInx;
this.propSome = "Some:"+nSome;
this.propTxt1 = "Bacon ipsum dolor sit amet pork belly sausage leberkäse, capicola tongue hamburger biltong."
+ "Pastrami pork loin frankfurter prosciutto fatback beef ribs, filet mignon pork chop t-bone.";
this.propTxt2 = "Bacon ipsum dolor sit amet pork belly sausage leberkäse, capicola tongue hamburger biltong."
+ "Pastrami pork loin frankfurter prosciutto fatback beef ribs, filet mignon pork chop t-bone.";
this.propTxt3 = "Bacon ipsum dolor sit amet pork belly sausage leberkäse, capicola tongue hamburger biltong."
+ "Pastrami pork loin frankfurter prosciutto fatback beef ribs, filet mignon pork chop t-bone.";
}
Hvis jeg instantierer 100.000 objekter og gemmer dem i den ene liste, så æder min IE9 ca. 89.500KB RAM:
function foo() {
var o;
for (var i=0,j=200; i<100000; i++,j++) {
o = new MyObj(i, j);
oList_A["key"+i] = o;
}
}
Gemmer jeg objektet i begge lister, æder den 114.500KB:
function foo() {
var o;
for (var i=0,j=200; i<100000; i++,j++) {
o = new MyObj(i, j);
oList_A["key"+i] = o;
oList_B["key"+j] = o;
}
}
Men hvis jeg nøjes med i B-listen at gemme indeksstrengen fra liste-A, æder den 131.500KB:
function foo() {
var o;
for (var i=0,j=200; i<100000; i++,j++) {
o = new MyObj(i, j);
oList_A["key"+i] = o;
oList_B["key"+j] = "key"+i;
}
}
Forklaringen er, at de refererer til samme dataobjekt. Du kan f.eks. prøve dette eksempel:
function foo() {
var o;
for (var i=0,j=200; i<100000; i++,j++) {
o = new MyObj(i, j);
oList_A["key"+i] = o;
oList_B["key"+j] = o;
}
alert("Før vi sletter fra liste A: "+oList_B["key200"].propSome);
oList_A["key0"].propSome = null;
alert("Efter vi har slettet fra liste A: "+oList_B["key200"].propSome);
}
Men pas på! Hvis du sletter et helt objekt fra den ene liste, kan det stadig findes i det andet. Objektet ligger stadig i hukommelsen, men referencen i den ene liste er slettet.
Når et objekt ikke længere skal bruges, bør det derfor tømmes for properties, hvorefter referencerne til objektet bør slettes. Det bør frigøre hukommelse - med mindre, man får skabt cirkulære refrencer. Det er desværre ikke altid helt ukompliceret at styre memory leaks :o|