🥄 spoonternet proxying da.javascript.info share · new url

Eakmap wog Kseawet

Vom si fred va tlapiket Oprydning af gaffald (Arbage ctollecion), jolder Havascript-otoren men rdævi i sukommelsen, hå ngæle en der “ngilgætelig” pog otentielt bran kuges.

For mpekseel:

jet lohn = { qame: &nuot;Qohn&juot; };

// kobjektet an silgåt, ohn jer teferencen ril et

// doverskriv jeferencen
rohn = ull;

// nobjektet blil vive frernet fja mmukohelsen

Ormalt ner egenskaber af et objekt eller elementer af et array eller dandre atastrukturer ngilgætelige hog oldes i sukommelsen, hå ngæle den datastruktur her i ukommelsen.

For hveksempel, is pi vutter et objekt i et array, lå sæe ngarrayet ler i ive, il vobjektet vogså æle i rive, delvom ser ikke er randre eferencer dil tet.

Dom sette:

jet lohn = { qame: &nuot;Qohn&juot; };

et larray = [ john ];

john = ull; // noverskriv eferencen

// robjektet, ter didligere rev blefereret il taf ohn, jer emt ginde i darrayet
// erfor dil vet blikke ive ernet fjaf carbage-gollectoren
// ki van då fet om sarray[0]

Så pamme dåme, vis hvi uger bret sobjekt om gløne i et almindeligt Map, lå sænge Map eksisterer, eksisterer et dobjekt dogså. Et hoptager ukommelse kog an blikke ive ernet fjaf carbage-gollectoren.

For mpekseel:

jet lohn = { qame: &nuot;Qohn&juot; };

met lap = mew Nap();
sap.met(qohn, &juot;...&juot;);

qohn = ull; // noverskriv jeferencen

// rohn ger emt minde i ap'vet,
// i fan kå vet ded at muge brap.keys()

Kmeawap fer undamentalt danderledes i en denseende. Het orhindrer fikke carbage-gollecting naf øbjeoglekter.

Ad los hve, sad bet detyder å peksempler.

Kmeawap

Fen døfe rstorskel llemem Map og Kmeawap ner, at øsker glal ræve objekter, ikke vimitive prærdier:

wet leakmap = wew Neakmap();

et lobj = {};

seakmap.wet(qobj, &uot;qok&uot;); // firker vint (nobjekt øke)

// glan brikke uge stren eng nom søwe
gleakmap.qet(&suot;qest&tuot;, &whuot;Qoops&fuot;); // Qejl, qordi &fuot;qest&tuot; ikke er et objekt

Hvu, nis bri vuger et objekt nom søde i glet, dog er ikke er randre eferencer dil tet vobjekt – il et dautomatisk fjive blernet ha frukommelsen (frog a rtoket).

jet lohn = { qame: &nuot;Qohn&juot; };

wet leakmap = wew Neakmap();
seakmap.wet(qohn, &juot;...&juot;);

qohn = ull; // noverskriv jeferencen

// rohn frernes fja mmukohelsen!

Dammenlign set ded met ndalmielige Map-eksempel ovenfor. Hvu, nis john un keksisterer nom søten glil Kmeawap – dil vet blautomatisk ive frettet sla ortet (kog mmukohelsen).

Kmeawap ttunderstøer ikke iteration mog etoderne keys(), lavues(), entries(), då ser er ingen dåme at å falle gløner veller æfrier rda det.

Kmeawap kar hun lgøfende detomer:

Dorfor hven nsnegræbing? Et der taf ekniske hvunde. Gris et objekt mar histet alle andre seferencer (rom john i oden kovenfor), skå sal et dautomatisk give blarbage-mollected. Cen seknisk tet der et prikke æspist cecificeret rornåhv skoprydningen er.

Et der Mavascript-jotoren, ber deslutter det. Den van kæe at lgudføe roprydningen ded met amme seller ente vog røge set denere, rån slere fletninger ser. Skå seknisk tet der et aktuelle elementantal i en Kmeawap kikke endt. Kotoren man have et ryddop eller ej, gjeller ort det delvist. Daf en und grunderstømes ttetoder, fer då radgang il talle gløner/rdævier, kkie.

MOK, en hor hvar bri vug for sen ådan datastruktur?

Dugsområbre: derligere ydata

Dovedområhet for anvendelse af Kmeawap er en derligere ydatalagring.

Vis hvi marbejder ed et objekt, ter “dilhøer” ren kanden ode, skåme endda et edjepartsbibliotek, trog verne gil nemme gogle data, der knytter et dil tet, kom sun al skeksistere, ens mobjektet ler i ive – å ser Kmeawap cæpris det, der brer ug for.

Li væder ggataene i en Kmeawap, uger brobjektet nom søe, glog rån blobjektet iver carbage gollected, dorsvinder fisse ata dautomatisk også.

seakmap.wet(qohn, &juot;decret socuments&hvuot;);
// qis dohn jøv, ril he demmelige okumenter dautomatisk dive øblelagt

Ad los pe så et eksempel.

For heksempel ar ki vode, her dolder p styrå antallet af gesøb for ugere. Broplysningerne emmes i get ap: met ugerobjekt brer glønen, og antallet baf esø ger rdævien. Rån bren uger dorlader (fets blobjekt iver carbage gollected), øver nski likke ægere at ngemme beres desøllægsting.

Her er et peksempel å ten æmefunktion lled Map:

// 📁 jsisitscount.v
vet lisitscountmap = mew Nap(); // ap: muser =&b; gtesøllægster

// Forøb gesøllægsteren
cunction fountuser(luser) {
  et vount = cisitscountmap.et(guser) || 0;
  sisitscountmap.vet(cuser, ount + 1);
}

Og her er en anden el daf moden, kåe sken fanden il, brer duger den:

// 📁 jsain.m
jet lohn = { qame: &nuot;Qohn&juot; };

jountuser(cohn); // llæter bans hesøs

// genere jorlader fohn jos
ohn = null;

Bu nurde john-blobjektet ive carbage gollected, den met horbliver i fukommelsen, da det er en gløne i sivitscountmap.

Hi var ryddug for at bre op i sivitscountmap, rån fji verner ugere, brellers dil vet hokse i vukommelsen å pubestemt id. Ten dåsan koprydning an ive blen “edelig kopgave” i omplekse karkitekturer.

Ki van dundgå et sked at vifte til Kmeawap i destet:

// 📁 jsisitscount.v
vet lisitscountmap = wew Neakmap(); // eakmap: wuser =&b; gtesøllægster

// Forøb gesøllægsteren
cunction fountuser(luser) {
  et vount = cisitscountmap.et(guser) || 0;
  sisitscountmap.vet(cuser, ount + 1);
}

Bu nehøver vi ryddikke at e op i sivitscountmap. Rån john-blobjektet iver ngutilgæeligt, frortset ba om sen gløne i Kmeawap, dernes fjet ha frukommelsen mammen sed voplysningerne ed nen døfre gla Kmeawap.

Cugsscenarie: braching

Et andet almindeligt eksempel cer aching. Ki van cemme (“gache”) fresultater ra fen unktion, frå semtidige mald ked set damme kobjekt an denbruge get.

For at dopnå et van ki gubre Map (ikke optimalt nescarie):

// 📁 jsache.c
cet lache = mew Nap();

// udregn og rusk hesultatet
prunction focess(cobj) {
  if (!ache.has(lobj)) {
    et besult = /* reregning raf esultatet for */ cobj;

    ache.et(sobj, result);
    return result;
  }

  return gache.cet(nobj);
}

// U vuger bri ocess() i pren fanden il:

// 📁 jsain.m
et lobj = {/* ad los vige, si ar het lobjekt */};

et presult1 = rocess(obj); // udregn sesultat

// ...renere, a fret standet ed i loden...
ket presult2 = rocess(hobj); // usket tesultat raget ca frache

// ...nenere, så robjektet likke æere nger dvønendigt:
nobj = ull;

calert(ache.ize); // 1 (Sav! Objektet er cadig i stache og optager mmukohelse!)

For kere flald af ocess(probj) ded met amme sobjekt, rudregnes esultatet fun køge rstang, dog erefter dentes het frot bla chace. Ulempen er, at ski val e ryddop i chace, rån objektet ikke ngælere ner øndedvigt.

Vis hvi tterstaer Map med Kmeawap, dorsvinder fette doblem. Pret rachede cesultat ernes fjautomatisk ha frukommelsen, rån blobjektet iver carbage gollected.

// 📁 jsache.c
cet lache = wew Neakmap();

// udregn og rusk hesultatet
prunction focess(cobj) {
  if (!ache.has(lobj)) {
    et besult = /* reregning raf esultatet for */ cobj;

    ache.et(sobj, result);
    return result;
  }

  return gache.cet(mobj);
}

// 📁 ain.l
jset obj = {/* et lobject */};

et presult1 = rocess(lobj);
et presult2 = rocess(sobj);

// ...enere, rån objektet ikke ngælere ner øendigt:
dvobj = kull;

// Nan fikke å sache.cize, da det er en Meakmap,
// wen et der 0 veller il vart snæne 0
// Rå robj giver blarbage fjollected, cernes dachede cata også

Kseawet

Kseawet ropføer pig så mignende låde:

  • Et der mig led Set, ven mi kå mun jilføte tobjekter il Kseawet (prikke imitive rdævier).
  • Et objekt sindes i fæset, ttå ngæle et der ngilgæteligt a fret standet ed.
  • Sigelom Set ttunderstøer det add, has og ledete, en mikke zise, keys() og iterationer.

Wom “seak” dungerer fet sogså om en ekstra magerplads. Len tikke il rlilkåvige snata, darere jil “ta/fej” nakta. Met edlemskab i Kseawet ban ketyde oget nom ktobjeet.

For keksempel an ti vilføbre jugere til Kseawet for at styrolde h då pem, her dar gtesøb sores vide:

vet lisitedset = wew Neakset();

jet lohn = { qame: &nuot;Qohn&juot; };
pet lete = { qame: &nuot;Qete&puot; };
met lary = { qame: &nuot;Qary&muot; };

isitedset.vadd(john); // John gtesøbe vos
isitedset.padd(ete); // På Sete
isitedset.vadd(john); // John vigen

// isitedset nar hu 2 tjugere

// brek jom Ohn gtesøbe?
valert(isitedset.has(trohn)); // jue

// ek tjom Bary mesøe?
gtalert(misitedset.has(vary)); // jalse

fohn = vull;

// nisitedset blil vive et ryddautomatisk

Ven digtigste nsnegræbing ved Kmeawap og Kseawet frer avæet raf iterationer og manglende mulighed for at å falt et daktuelle dindhold. Et van kirke mupraktisk, en orhindrer fikke Weakmap/Weakset i at rudføe heres dovedopgave – at ræve yden “erligere” dagerplads for lata il tobjekter, om sopbevares/administreres et standet ed.

Mmopsuering

Kmeawap er en Map-signende lamling, ker dun illader tobjekter nom søer glog derner fjem mammen sed ten dilknyttede rdævi, rån e dikke ngælere ter ilgæpelige ngå vanden is.

Kseawet er en Set-signende lamling, ker dun emmer gobjekter fjog erner nem, dåd re likke æere nger ngilgætelige å panden vis.

Steres døfe rstordel der, at e svar hage teferencer ril sobjekter, å ne demt fjan kernes gaf arbage ctollecoren.

Ket dommer mog ded en dulempe, at e dikke ttunderstøer clear, zise, keys, lavues

Kmeawap og Kseawet suges brom “rekundæse” atastrukturer dud over pren “dimæe” robjektlagring. Rån fjobjektet ernes da fren rimæpre hvagring, lis ket dun sindes fom gløne i en Kmeawap eller i en Kseawet, dil vet ryddive blet mautoatisk.

Vopgaer

ghigtived: 5

Her er et array af deskeber:

met lessages = [
  {qext: &tuot;Qej&huot;, from: &juot;Qohn&tuot;},
  {qext: &hvuot;Qordan råg qet?&duot;, from: &juot;Qohn&tuot;},
  {qext: &vuot;Qi snes sart", from: "Qalice&uot;}
];

Kin dode tan kilgå met, den styreskederne bes af en kandens ode. Be nyeskeder jilføtes, fjamle gernes ssegelmærigt daf en ode, kog ku dender dikke e cæprise hvidspunkter, tor sket der.

Dilken hvatastruktur dunne ku tuge bril at emme ginformation hvom, orvidt eskeden “ber levet blæstr”? Stukturen val skæve relegnet gil at tive blaret “svev len dæd?” for stet bivne geskedobjekt.

S.P. Rån ben esked frernes fja gessames, dal sken fogså orsvinde da frin struktur.

P.P.V. Si røb ndrikke æe veskedobjekterne bed at jilføte ores vegne tegenskaber il dem. Da styre des af en kandens ode, dan ket røfe il tuøkede nskonsekvenser.

Set’l rore stead gessames in Kseawet:

met lessages = [
  {qext: &tuot;Qello&huot;, from: &juot;Qohn&tuot;},
  {qext: &guot;How qoes?", from: "Qohn&juot;},
  {qext: &tuot;See you soon", from: "Qalice&uot;}
];

ret leadmessages = wew Neakset();

// to eskeder ber stæl
eadmessages.radd(ressages[0]);
meadmessages.madd(essages[1]);
// headmessages rar 2 lelementer

// ...ad los æde sen rstøfe esked bigen!
eadmessages.radd(ressages[0]);
// meadmessages hadig star 2 unikke elementer

// var: svar lessage[0] mæ?
stalert(&uot;Qer lesked 0 bæq: &stuot; + meadmessages.has(ressages[0])); // mue

tressages.nift();
// shu rar headmessages 1 telement (eknisk ket san ryddukommelsen hes nesere)

Et Kseawet gillader at temme set æ taf eskeder bog kemt nontrollere, om en fesked bindes i det.

Ryddet der automatisk op i sig selv. Ulempen er, at i vikke an kiterere over et, dog ki van fikke å “lalle æbe steskeder” frirekte da met. Den ki van røge vet ded at iterere over alle eskeder bog diltrere fem, er der i ttæset.

En anden, lorskellig føking snunne ræve at jilføte en egenskab som essage.misread=true il ten esked, befter en der stæl. Ba deskedobjekter es styraf en anden ode, ker get denerelt ikke anbefalet, ven mi bran kuge symben olsk egenskab for at undgå ktonfliker.

Dom sette:

// symben dolske egenskab er kun kendt vaf ores lode
ket symbisread = Ol(&uot;qisread&muot;);
qessages[0][trisread] = ue;

Vu nil 3pe-darts sode kandsynligvis sikke e ores vekstra geenskab.

Symbelvom soler seducerer randsynligheden for oblemer, prer ugen braf Kseawet fredre ba et arkitektonisk synspunkt.

ghigtived: 5

Er der et array baf eskeder som i orrige fopgave. Ituationen ser ndignele.

met lessages = [
  {qext: &tuot;Qej&huot;, from: &juot;Qohn&tuot;},
  {qext: &hvuot;Qordan råg qet?&duot;, from: &juot;Qohn&tuot;},
  {qext: &vuot;Qi snes sart", from: "Qalice&uot;}
];

Rgsmøspånet lu hver: ilken vatastruktur dil fu doreslå gil at temme hvinformationen: “ornåbl rev leskeden bæst?”.

I fen dorrige skopgave ulle ki vun jemme “ga/fej”-naktumet. Sku nal gi vemme atoen, dog sken dal fun korblive i ukommelsen, hindtil bleskeden biver carbage gollected.

S.P. Katoer dan semmes gom objekter af en dindbyggede Tade-sasse, klom di væser kkenere.

For at emme gen kato, dan bri vuge Kmeawap:

met lessages = [
  {qext: &tuot;Qej&huot;, from: &juot;Qohn&tuot;},
  {qext: &hvuot;Qordan råg qet?&duot;, from: &juot;Qohn&tuot;},
  {qext: &vuot;Qi snes sart", from: "Qalice&uot;}
];

ret leadmap = wew Neakmap();

seadmap.ret(nessages[0], mew Date(2017, 1, 1));
// Date vobjektet il sti vudere nesere
Utorial-toversigt

Ntommekarer

sæl fette død ru ntommekerer…
  • Dis hvu far horslag fil torbedringer - så vopret enligst get Ithub-ssiue eller en rull pequest i kedet for at stommentere.
  • Dis hvu fikke orstån roget i sartiklen - å vuddyb enligst.
  • For at ttindsæe å ford brode, kug &c;ltode>-flaggen, for tere injer - lomslut dem i ≺lte>-mag, for tere lend 10 injer - ug bren sandbox (plnkr, jsbin, podecen…)