2011-07-21 3 views
5

Я программист на C/C++/Java, работающий с JavaScript.Javascript «delete» не работает внутри цикла итерации

Я пытаюсь написать функцию, которая удалит все свойства объекта 'obj'. Я прочитал сообщение на «How to quickly clear a Javascript Object?» и увидел, что есть два ответа: (1) создание нового «obj» (чего я не хочу делать, потому что мой код - это высокопроизводительная программа, работающая в мобильном браузере , и я хочу свести к минимуму сбор мусора); и (2) итерирование свойств объекта в цикле и удаление свойств. Этот последний подход не работает в Chrome 12.

Рассмотрим следующий код:

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); 

В результате получается следующий результат в моей консоли на Chrome 12:

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

Почему не foo.baz удаляется внутри цикла?

ответ

8

Вы выполните поиск key в неправильном направлении. Вы должны использовать кронштейн обозначение:

delete foo[ prop ]; 

Однако, вам не нужен перебрать каждое свойство в пределах объекта. Это нормально, чтобы null ссылка на объект. Сборщик мусора позаботится о вас.

foo = null; // done 

Говоря о высокой производительности, это то, как вы хотите.

+0

(1) У меня создалось впечатление, что обозначения свойств foo.prop и foo [prop] эквивалентны, например, как указано в http://www.jibbering.com/faq/faq_notes/square_brackets.html. (2) Почему «delete foo.baz» работает в моем примере? (3) Как я уже упоминал, я хочу свести к минимуму сбор мусора, так как я работаю над мобильным браузером. – stackoverflowuser2010

+0

'foo.prop' эквивалентно' foo ["prop"] '. увидеть разницу? Если вы хотите динамически вытащить свойство из 'foo', вам нужно использовать' foo [prop] '. – digitalbath

+0

@ stackoverflowuser2010: Я добавил бы больше веры в GC. Если вы не создаете тонну объектов при каждом нажатии, вы должны быть в порядке. Явное удаление всех свойств, а затем добавление новых может занять больше времени, чем просто создать новый, и оставить старый в GC! – delnan

3

Данная строка delete foo.prop неверна. foo в этом случае не имеет свойства prop. Использование скобок delete foo[prop].

+0

Хм. Интересно, почему это было приостановлено. Я не вижу в этом ничего плохого. – Reid

+0

Я подумал. Я думаю, кто-то завидовал моему быстрому ответу. ;) – Joe

0

Потому что foo.prop никогда не определялось для удаления. Вы должны удалить его, как это:

delete foo[prop]; 
0

Попробуйте вместо этого:

delete foo[prop]; 

НТН

Смежные вопросы