2013-04-19 3 views
0

я следующая функция, которая должна удалить объект в объект под следующим идентификатором:Javascript удалить объект из объекта

contactDeleteCounter++; 
console.log(orderContactIds); 
console.log(deletePosition); 
console.log(orderContactIds[deletePosition]); 
delete orderContactIds.deletePosition; 
console.log(orderContactIds.deletePosition); 
console.log(orderContactIds); 
console.log(deletePosition); 

Проблема в том, что я все прекрасно работает в Chrome, но Firebug в Firefoxshows меня следующий вывод:

Object { 0={...}, 1={...}, 2={...}} 
2 
Object { id= "20" , type= "1" } 

undefined 
Object { 0={...}, 1={...}, 2={...}} 
2 

Как вы видите, атрибут не определен, но когда я смотрю в объект, он все еще там ...?

ответ

0

Оператор delete удаляет только ссылку, а не сам объект. Если бы он удалил сам объект, другие оставшиеся ссылки были бы свисающими, например, C++ delete. (И доступ к одному из них может привести к сбою. Для того, чтобы все они обменивались с нулем, это означало бы наличие дополнительной работы при удалении или дополнительной памяти для каждого объекта.)

Поскольку Javascript собран с мусором, вам не нужно удалять объекты сами - они будут удалены, когда больше не будет ссылок на них.

Может быть полезно удалить ссылки на объект, если вы закончили с ними, поскольку это дает сборщику мусора дополнительную информацию о том, что можно вернуть. Если ссылки остаются на большом объекте, это может привести к его невосстановлению - даже если остальная часть вашей программы фактически не использует этот объект.

+0

orderContactIds является глобальным объектом, что мне нужно все время, как я могу удалить объект с ID = 2? Не в ссылке, а в глобальной ценности? NB !: Этот код работает в Chrome btw !? – ekussberg

+0

, если вам действительно нужно удалить метод, свойство, объект в объекте, попробуйте сделать новый объект, преобразованный в массив (если он работает для вас), и там вы сможете лучше управлять значениями. Всегда используйте массивы вместо объектов, когда вам нужно манипулировать содержимым массива. Поскольку массив представляет собой не что иное, как объект js, он по-прежнему имеет несколько методов, которые вы не можете использовать для объектов. Надеюсь, что это помогло ... –

1

Ответ создать обратный вызов и сделать асинхронной Jquery:

function deleteCallback(deletePosition) { 
    $.ajaxSetup({ 
     async : false 
    }); 
    console.log(orderContactIds); 
    console.log(deletePosition); 
    console.log(orderContactIds[deletePosition]); 
    delete orderContactIds[deletePosition]; 
    console.log(orderContactIds.deletePosition); 
    console.log(orderContactIds); 
    console.log(deletePosition); 
    $.ajaxSetup({ 
     async : true 
    }); 
} 
Смежные вопросы