Jestem trochę mylony z delete
operatorem JavaScript . Weź następujący fragment kodu:
var obj = {
helloText: "Hello World!"
};
var foo = obj;
delete obj;
Po wykonaniu tego fragmentu kodu obj
jest null
, ale foo
nadal odnosi się do obiektu dokładnie takiego jak obj
. Zgaduję, że ten obiekt jest tym samym obiektem, który foo
wskazywał.
To mnie dezorientuje, ponieważ spodziewałem się, że pisanie delete obj
usunie obiekt obj
wskazany w pamięci - nie tylko zmienną obj
.
Czy to dlatego, że moduł czyszczenia pamięci JavaScript działa na zasadzie zatrzymania / wydania, więc jeśli nie miałbym żadnych innych zmiennych wskazujących na obiekt, zostałby on usunięty z pamięci?
(Nawiasem mówiąc, moje testy zostały wykonane w Safari 4.)
javascript
pointers
object
memory-management
garbage-collection
Steve Harrison
źródło
źródło
var obj = { helloText: "Hello World!" }; var foo = obj; delete obj;
obiekt nie jest usuwany sprawdźobj
usuń użycie:delete obj.helloText
a następnie sprawdźfoo now foo is an empty object
delete
nie służy do usuwania obiektów w javascript.delete
Służy do usuwania klucza obiektu. W twoim przypadkuvar obj = { helloText: "Hello World!" }; var foo = obj; delete obj;
obiekt nie jest usuwany. Sprawdźobj
. Następnie uruchomdelete obj.helloText
i widać, żefoo
teraz wskazuje na pusty obiekt. ”„ ”Odpowiedzi:
Operator usuwania usuwa tylko odwołanie, nigdy sam obiekt. Gdyby usunął sam obiekt, inne pozostałe odniesienia byłyby wiszące, jak usunięcie C ++. (Uzyskiwanie dostępu do jednego z nich spowodowałoby awarię. Aby wszystkie stały się zerowe, oznaczałoby to dodatkową pracę podczas usuwania lub dodatkową pamięć dla każdego obiektu.)
Ponieważ JavaScript jest śmieciami, nie musisz samodzielnie usuwać obiektów - zostaną one usunięte, gdy nie będzie już możliwości odwoływania się do nich.
Przydatne może być usunięcie odniesień do obiektu, jeśli już z nimi skończyłeś, ponieważ daje to śmieciarzowi więcej informacji na temat tego, co można odzyskać. Jeśli odniesienia do dużego obiektu pozostaną, może to spowodować, że nie zostanie ono odebrane - nawet jeśli reszta programu nie używa tego obiektu.
źródło
delete
kluczowe działa tylko dla właściwości obiektu, a nie dla zmiennych. perfectionkills.com/understanding-deletevar obj = {a: {}}; delete obj.a;
window
?var
)delete
Komenda nie ma wpływu na zmienne regularnych, tylko właściwości. Podelete
poleceniu właściwość nie ma wartościnull
, w ogóle nie istnieje.Jeśli właściwość jest odwołaniem do obiektu,
delete
polecenie usuwa właściwość, ale nie obiekt. Śmieciarka zajmie się obiektem, jeśli nie ma do niego innych odniesień.Przykład:
(Testowane w Firefox.)
źródło
x
zmienna staje się tylko właściwościąwindow
obiektu globalnego idelete x;
naprawdęx
całkowicie ją usuwa .x
nie będzie to właściwa zmienna w niektórych przeglądarkach, ale właściwość wwindow
obiekcie. Jest to oczywiście problem z konsolą i nie odzwierciedla normalnego wykonywania kodu.„zmienne zadeklarowane niejawnie” są właściwościami obiektu globalnego, więc delete działa na nich tak, jak działa na dowolnej właściwości. Zmienne zadeklarowane za pomocą var są niezniszczalne.
źródło
let
.Pochodząc z Dokumentacji Mozilli: „Za pomocą operatora delete można usuwać zmienne zadeklarowane niejawnie, ale nie zmienne zadeklarowane za pomocą instrukcji var”.
Oto link: https://developer.mozilla.org/En/Core_JavaScript_1.5_Reference:Operators:Special_Operators:delete_Operator
źródło
delete
nie jest używany do usuwania obiektu ze skryptu Java.delete
służy do usunięciaobject key
w twoim przypadkuobiekt nie jest usuwany sprawdź obj nadal przyjmuje te same wartości usuń użycie:
a następnie sprawdź
obj, foo
, oba są pustymi obiektami.źródło
Właśnie znalazłem jsperf, który możesz uznać za interesujący w świetle tej kwestii. (przydatne może być trzymanie go w pobliżu, aby uzupełnić obraz)
Porównuje usuwanie , ustawienie wartości zerowej i ustawienie niezdefiniowane .
Pamiętaj jednak, że sprawdza to przypadek, gdy wielokrotnie usuwasz / ustawiasz właściwość.
źródło
Oprócz pytań GC, dla wydajności należy wziąć pod uwagę optymalizacje, które przeglądarka może wykonywać w tle ->
http://coding.smashingmagazine.com/2012/11/05/writing-fast-memory-efficient-javascript/
Wygląda na to, że lepiej jest zerować odwołanie, niż je usunąć, ponieważ może to zmienić „zakulisową” klasę, której używa Chrome.
źródło
W IE 5 do 8 występuje błąd polegający na tym, że użycie delete we właściwościach obiektu hosta (Window, Global, DOM itp.) Powoduje błąd TypeError „obiekt nie obsługuje tej akcji”.
Później, jeśli musisz sprawdzić, gdzie właściwość ma znaczenie pełne wykorzystanie wartości,
el.foo !== undefined
ponieważ"foo" in el
zawsze zwróci true w IE.Jeśli naprawdę potrzebujesz tej nieruchomości, aby naprawdę zniknęła ...
jeśli potrzebujesz użyć obiektu hosta z api hosta ...
źródło
Natknąłem się na ten artykuł, szukając tej samej odpowiedzi. Skończyło się na wyrzuceniu
obj.pop()
wszystkich przechowywanych wartości / obiektów w moim obiekcie, aby móc ponownie użyć tego obiektu. Nie jestem pewien, czy jest to zła praktyka, czy nie. Ta technika przydała mi się podczas testowania mojego kodu w narzędziach Chrome Dev lub konsoli internetowej FireFox.źródło
To dla mnie działa, choć nie jest to dobra praktyka. Po prostu usuwa wszystkie powiązane elementy, do których należy obiekt.
źródło
Ustawienie zmiennej tak
null
, aby łamać wszelkie odniesienia do obiektów we wszystkich przeglądarkach, w tym odwołania cykliczne między elementami DOM a zakresami Javascript. Za pomocądelete
polecenia zaznaczamy obiekty, które mają zostać wyczyszczone przy następnym uruchomieniu Garbage collection, ale jeśli istnieje wiele zmiennych odnoszących się do tego samego obiektu, usunięcie jednej zmiennej NIE spowoduje uwolnienia obiektu, po prostu usunie połączenie między tą zmienną a obiekt. A przy następnym uruchomieniu Garbage collection tylko zmienna zostanie wyczyszczona.źródło