Jak zauważa Mike Samuel w swojej odpowiedzi, jednym z najczęstszych zastosowań usuwania jest traktowanie obiektu jako "torby własności", która wiąże nazwy z wartościami. Logicznie jest różnica między "ta nazwa jest teraz odwzorowana na jakąś fałszywą wartość" i "ta nazwa w ogóle nie jest odwzorowana". "usuń" osiąga to drugie.
Wszystko to jest właściwie zrozumiałe. Pomyślałem, że mogę dodać interesującą uwagę historyczną dotyczącą silników JScript 1.0 do 5.0.
W tych oryginalnych implementacjach Microsoft w języku JScript używaliśmy obiektów IDispatch w stylu automatyzacji OLE do implementacji obiektów expando. IDispatch działa oczywiście przez skojarzenie nazwy z "identyfikatorem wysyłki", który jest po prostu liczbą całkowitą. Aby wywołać dynamicznie, najpierw należy poprosić obiekt wysyłki o nadanie ID wysyłki powiązanego z nazwą, a następnie powiedzieć "teraz wywołaj metodę powiązaną z tym ID, biorąc pod uwagę te argumenty".
Wszystko dobrze i dobrze. Ale jednym z wymogów umowy IDispatch jest to, że odwzorowanie od nazwy do wysyłki ID będzie stabilne przez cały okres istnienia obiektu. Jeśli więc ktoś powie "dodaj właściwość Foo do tego obiektu", możemy zdecydować, że właściwość Foo jest powiązana z identyfikatorem wysyłki 0x1234 w tym obiekcie. Od tego momentu, za każdym razem, gdy obiekt jest pytany o identyfikator wysyłki "Foo", musi zwrócić 0x1234, , nawet jeśli Foo zostanie usunięte, a następnie dodane ponownie. Pozwala to wywołującemu utrzymać własną szybką pamięć podręczną par nazw/dyspozycji, zamiast zawsze wymagać zadawania obiektu przy każdym wywołaniu.
Praktyczny wynik tego jest taki, że "delete" w żaden sposób nie zmniejsza obciążenia pamięci obiektu w tej implementacji! Po usunięciu właściwości (w pierwotnej implementacji) musimy dodać bit do obiektu oznaczającego ten identyfikator wysyłki jako usunięty, ale musimy zachować wszystkie informacje o powiązaniu nazwy/identyfikatora w przypadku, gdy nazwa kiedykolwiek wróci. Dodanie ogromnej liczby właściwości do obiektu, a następnie usunięcie wszystkich obiektów, nie zmniejsza obiektu w pamięci.
Silnik JScript został oczywiście całkowicie przepisany od mojego czasu (z wyjątkiem, jak sądzę, parsera i lexera), więc nie mam pojęcia, czy silnik nadal ma to niezwykłe dziwactwo. Byłoby interesujące dowiedzieć się.
Zachowanie 'delete' nie jest wcale skomplikowane.Ale ** naprawdę ** nie powinno być nazywane 'delete'. Skrypty JavaScript są syntaktycznie podobne do C++, używając operatora C++, ale robią coś * zupełnie inaczej * z tym, że było trochę oops i spowodowało to całe zamieszanie. (Jeśli nazywa się to "usuń", założę się, że ludzie nie byliby aż tak zagubieni.) –
http://perfectionkills.com/understanding-delete/ – Raghu