Objektų trynimas javascript

Aš šiek tiek painiojau su „JavaScript“ delete operatoriumi. Atlikite šį kodo fragmentą:

 var obj = { helloText: "Hello World!" }; var foo = obj; delete obj; 

Atlikus šią kodo dalį, obj yra null , bet foo vis dar nurodo objektą, kaip ir obj . Manau, kad šis objektas yra tas pats objektas, kurį nurodė foo .

Tai suklaidina mane, nes tikėjausi, kad delete obj įrašą būtų delete obj objektas, kuris buvo pažymėtas atmintyje, o ne tik kintamasis obj .

Ar tai yra todėl, kad „JavaScript“ šiukšlių surinkėjas veikia išsaugojimo / išleidimo pagrindu, todėl, jei neturiu kitų kintamųjų, rodančių objektą, ar jis būtų pašalintas iš atminties?

(Beje, mano testavimas buvo atliktas „Safari 4“.)

325
13 апр. Steve Harrison paprašė balandžio 13 d 2009-04-13 02:18 '09 2:18 am 2009-04-13 02:18
@ 12 atsakymų

Ištrinti operatorius ištrina nuorodą, o ne pats objektas. Jei jis ištrintų patį objektą, kitos likusios nuorodos bus pakabinamos, pvz., C ++. (Ir prieiga prie vieno iš jų sukels avariją. Kad visi jie galėtų keistis nuliu, tai reikštų papildomą darbą, kad pašalintumėte arba papildytumėte atmintį kiekvienam objektui.)

Kadangi „JavaScript“ yra šiukšlių surinkimas, nereikia pačių objektų ištrinti - jie bus ištrinti, kai daugiau nuorodų nebus.

Gali būti naudinga pašalinti objektų nuorodas, jei baigsite su jais, nes tai suteikia papildomos informacijos apie tai, kas gali būti grąžinta. Jei nuorodos lieka dideliame objekte, tai gali sukelti jo atkūrimą, net jei likusioje programos dalyje faktiškai šis objektas nenaudojamas.

409
13 апр. Atsakymą pateikė Jesse Rusak, balandžio 13 d. 2009-04-13 02:59 '09, 02:59 val. 2009-04-13 02:59

delete komanda neturi įtakos paprastiems kintamiesiems, bet tik savybėms. Po delete komandos nuosavybė nėra null , ji visai neegzistuoja.

Jei nuosavybė yra objekto nuoroda, delete komandą ištrina nuosavybę, bet ne objektą. Šiukšlių surinkėjas rūpinsis objektu, jei jis neturi kitų nuorodų.

Pavyzdys:

border=0
 var x = new Object(); xy = 42; alert(xy); // shows '42' delete x; // no effect alert(xy); // still shows '42' delete xy; // deletes the property alert(xy); // shows 'undefined' 

(Išbandyta „Firefox“.)

145
13 апр. Guffa atsakymas, pateiktas balandžio 13 d 2009-04-13 02:39 '09 at 2:39 2009-04-13 02:39

„Netiesiogiai deklaruoti kintamieji“ yra visuotinio objekto savybės, todėl ištrynimas veikia juos taip, tarsi jis veiktų su bet kokiu turtu. Kintamieji, deklaruoti su var, yra neperleidžiami.

47
13 июля '11 в 23:54 2011-07-13 23:54 atsakymą pateikė Alex liepos 13 d. 11 val. 23:54 2011-07-13 23:54

Remiantis „Mozilla“ dokumentacija: „Galite ištrinti operatorių ištrinti kintamuosius, kurie yra netiesiogiai deklaruoti, bet nenurodyti naudojant var operatorių.“

Čia yra nuoroda: https://developer.mozilla.org/En/Core_JavaScript_1.5_Reference:Operators:Special_Operators : delete_Operator

23
13 апр. David Ackerman atsakymas, pateiktas balandžio 13 d 2009-04-13 02:42 '09, 2:42 2009-04-13 02:42

remiantis @Guffa atsakymu. Radau, kad šis metodas veikia man:

 var obj = { helloText: "Hello World!" }; obj = null; delete obj; 

Pirmiausia nustatydami obj null objektą, pašalinote visą nuorodą į jį, tada galite ją visiškai pašalinti.

Nenaudojau jos kitoje naršyklėje, bet ji veikia 1.7.0

7
21 июня '12 в 9:56 2012-06-21 09:56 atsakymą Bohr pateikė birželio 12 d. 12 val. 9:56 2012-06-21 09:56

delete nėra naudojamas ištrinti objektą „Java“ scenarijuje.

delete naudojamas ištrinti object key jūsų atveju.

var obj = { helloText: "Hello World!" }; var foo = obj; delete obj;

objektas neištrinamas. patikrinimas obj vis dar turi tas pačias vertes. ištrinti naudojimą:

delete obj.helloText

tada patikrinkite obj, foo , abu yra tuščias objektas.

4
15 апр. atsakymą pateikė Umair Ahmed balandžio 15 d 2016-04-15 13:55 16 val. 15 val. 2016-04-15 13:55

Tiesiog radote jsperf , kuris, atrodo, gali būti įdomus atsižvelgiant į šią problemą. (tai būtų patogu laikyti aplink, kad užpildytumėte vaizdą)

Jis lygina ištrinimą nustatydamas nulį ir nustatymą neapibrėžtą .

Tačiau nepamirškite, kad ji patikrina atvejį, kai ištrinate / nustatote turtą daug kartų.

2
12 февр. Atsakymą pateikė garekas vasario 12 d. 2015-02-12 20:17 '15, 8:17 pm 2015-02-12 20:17

Be GC klausimų, atlikdami našumą, turėtumėte apsvarstyti optimizavimą, kurį naršyklė gali atlikti fone →

http://coding.smashingmagazine.com/2012/11/05/writing-fast-memory-efficient-javascript/

Atrodo, kad būtų geriau iš naujo nustatyti nuorodą nei ištrinti, nes tai gali pakeisti klasę už „Chrome“ naudojamų scenų.

2
08 апр. atsakymą pateikė sksizer 08 apr. 2013-04-08 01:51 '13, 1:51, 2013-04-08 01:51

„IE 5-8“ turi klaidą, kai naudojant pašalinimą iš pagrindinio objekto savybių („Window“, „Global“, „DOM“ ir pan.) Atsiranda TypeError objektas, kuris nepalaiko šio veiksmo.

 var el=document.getElementById("anElementId"); el.foo = {bar:"baz"}; try{ delete el.foo; }catch(){ //alert("Curses, drats and double double damn!"); el.foo=undefined; // a work around } 

Vėliau, jei jums reikia patikrinti, kur nuosavybė turi visą vertę, naudokite el.foo !== undefined , nes "foo" in el visada bus teisinga IE.

Jei tikrai reikia turto, kad tikrai išnyktumėte ...

 function hostProxy(host){ if(host===null || host===undefined) return host; if(!"_hostProxy" in host){ host._hostproxy={_host:host,prototype:host}; } return host._hostproxy; } var el=hostProxy(document.getElementById("anElementId")); el.foo = {bar:"baz"}; delete el.foo; // removing property if a non-host object 

jei jums reikia naudoti pagrindinį objektą su priimančiosios api ...

 el.parent.removeChild(el._host); 
1
18 нояб. Johnndutcheson atsakymas lapkričio 18 d 2011-11-18 01:03 '11 at 1:03 2011-11-18 01:03

Nustatant kintamąjį „ null galite nutraukti bet kokias nuorodas į objektus visose naršyklėse, įskaitant aplinkinius ryšius tarp „DOM“ elementų ir „Javascript“ regionų. Naudodami delete komandą, kitą kartą, kai bus pradėtas šiukšlių surinkimas, pažymime išvalomus objektus, tačiau, jei yra keli kintamieji, susiję su tuo pačiu objektu, ištrinant vieną kintamąjį NEĮRAŠO objekto, jis tiesiog ištrins nuorodą tarp šio kintamojo ir objekto. Ir kitą kartą paleidus šiukšlių surinkimą, bus pašalintas tik kintamasis.

0
18 сент. Pedro Justo atsakymas 18 sept. 2014-09-18 13:36 '14, 13:36 pm 2014-09-18 13:36

Šis darbas yra man, nors tai nėra gera praktika. Jis tiesiog ištrina visą susijusį elementą, su kuriuo objektas priklauso.

  for (element in homeService) { delete homeService[element]; 
0
26 июня '16 в 20:36 2016-06-26 20:36 Atsakymas pateikiamas vineet sagar birželio 26 d. 16:36 2016-06-26 20:36

Ieškodamas to paties atsakymo, aš įstrigo šiame straipsnyje. Baigiau tiesiog atspausdinti obj.pop() visus saugomus mano objekto reikšmes / objektus, kad galėčiau pakartotinai naudoti objektą. Nežinote, ar tai yra bloga praktika. Šis metodas naudingas bandant kodą „Chrome Dev“ įrankiuose arba „FireFox“ žiniatinklio konsolėje.

0
04 авг. atsakymas, kurį pateikė Craig London 04 rug 2013-08-04 10:30 '13, 10:30 2013-08-04 10:30