2011-07-21 19 views
5

Jestem programistą C/C++/Java pracującym z JavaScript.JavaScript 'delete' nie działa w pętli iteracyjnej

Próbuję napisać funkcję, która usunie wszystkie właściwości obiektu "obj". Przeczytałem wpis na "How to quickly clear a Javascript Object?" i zobaczyłem, że są dwie odpowiedzi: (1) tworzenie nowego "obiektu" (którego nie chcę robić, ponieważ mój kod jest programem o wysokiej wydajności działającym w przeglądarce mobilnej i chcę zminimalizować odśmiecanie); i (2) iterowanie po właściwościach obiektu w pętli i usuwanie właściwości. To ostatnie podejście nie działa w Chrome 12.

Rozważmy następujący kod:

var foo = {}; 
foo['baz'] = 'bar'; 
console.log("1. foo.baz = " + foo.baz); 

delete foo.baz; 
console.log("2. foo.baz = " + foo.baz); 

foo['baz'] = 'bar'; 
console.log("3. foo.baz = " + foo.baz); 

for (prop in foo) 
{ 
    if (foo.hasOwnProperty(prop)) 
    { 
     console.log("deleting property " + prop); 
     delete foo.prop; 
    } 
} 
console.log("4. foo.baz = " + foo.baz); 

To daje następujący wynik w mojej konsoli w Chrome 12:

1. foo.baz = bar 
2. foo.baz = undefined 
3. foo.baz = bar 
deleting property baz 
4. foo.baz = bar 

Dlaczego nie foo.baz zostanie usunięty w pętli?

Odpowiedz

8

ty odnośnika key w niewłaściwy sposób. Trzeba użyć notacji wspornik:

delete foo[ prop ]; 

Jednak nie trzeba do pętli nad każdym majątku na terenie obiektu. To jest w porządku dla samego obiektu odniesienia. Śmieciarz zaopiekuje się tobą.

foo = null; // done 

Mówiąc o wysokiej wydajności, tak właśnie chcesz.

+0

(1) Miałem wrażenie, że notacja właściwości foo.prop i foo [prop] są równoważne, na przykład jak wspomniano w http://www.jibbering.com/faq/faq_notes/square_brackets.html. (2) Dlaczego "delete foo.baz" działa w moim przykładzie? (3) Jak już wspomniałem, chcę zminimalizować usuwanie śmieci, ponieważ pracuję w przeglądarce mobilnej. – stackoverflowuser2010

+0

'foo.prop' jest równoważne' foo ["prop"] '. Zobacz różnicę? Jeśli chcesz dynamicznie pobierać własność z 'foo', musisz użyć' foo [prop] '. – digitalbath

+0

@ stackoverflowuser2010: Powiedziałbym więcej wiary w GC. Jeśli nie tworzysz mnóstwa obiektów przy każdym kliknięciu, powinieneś być w porządku. Jawne usunięcie wszystkich właściwości, a następnie dodanie nowych może zająć więcej czasu niż tylko utworzenie nowego i pozostawienie starego do GC! – delnan

3

Ta linia delete foo.prop jest niepoprawna. foo nie ma w tym przypadku właściwości o nazwie prop. Korzystanie z nawiasów delete foo[prop].

+0

Hmm. Zastanawiam się, dlaczego to zostało odrzucone. Nie widzę w tym nic złego. – Reid

+0

Zastanowiłem się. Myślę, że ktoś był zazdrosny o moją szybką odpowiedź. ;) – Joe

0

Ponieważ foo.prop nigdy nie zdefiniowano do usunięcia. Trzeba go usunąć tak:

delete foo[prop]; 
0

Spróbuj to zamiast:

delete foo[prop]; 

HTH