Удаление объектов в JavaScript

Я немного запутался с оператором delete JavaScript. Возьмите следующий фрагмент кода:

 var obj = { helloText: "Hello World!" }; var foo = obj; delete obj; 

После выполнения этой части кода obj имеет значение null , но foo прежнему относится к объекту, точно подобному obj . Я предполагаю, что этот объект является тем же объектом, на который указывает foo .

  • Установить цвет фона в шестнадцатеричном формате
  • Как отключить ключи Windows (клавиша логотипа и клавиша меню) с помощью Javascript
  • Угловой JS подтвердить перед изменением маршрута
  • Запустить код jQuery после того, как AngularJS завершает рендеринг HTML
  • Как я должен обрабатывать анимацию останова в компонентеWillUnmount в React?
  • Функция jQuery .css () не возвращает ожидаемые значения
  • Это меня смущает, потому что я ожидал, что запись delete obj на который указывает obj в памяти, а не только переменная obj .

    Это связано с тем, что сборщик мусора JavaScript работает над принципом сохранения / освобождения, так что, если бы у меня не было других переменных, указывающих на объект, оно было бы удалено из памяти?

    (Кстати, мое тестирование было выполнено в Safari 4.)

  • Найти объект по id в массиве объектов JavaScript
  • JavaScript-эквивалент метода расширения jQuery
  • Как вы можете сделать переменную / объект только для чтения в Javascript?
  • Использование переменной «name» не работает с объектом JS
  • Установите неопределенное свойство javascript перед чтением
  • Как заставить браузер перезагружать кэшированные файлы CSS / JS?
  • 12 Solutions collect form web for “Удаление объектов в JavaScript”

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

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

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

    Команда delete не влияет на обычные переменные, а только на свойства. После команды delete свойство не имеет значения null , оно вообще не существует.

    Если свойство является ссылкой на объект, команда delete удаляет свойство, но не объект. Сборщик мусора позаботится об объекте, если у него нет других ссылок на него.

    Пример:

     var x = new Object(); xy = 42; alert(xy); // shows '42' delete x; // no effect alert(xy); // still shows '42' delete xy; // deletes the property alert(xy); // shows 'undefined' 

    (Протестировано в Firefox.)

    «Переменные, объявленные неявно» являются свойствами глобального объекта, поэтому удаление работает над ними, как будто оно работает с любым свойством. Переменные, объявленные с помощью var, нерушимы.

    Исходя из документации Mozilla: «Вы можете использовать оператор delete для удаления переменных, объявленных неявно, но не объявленных с помощью инструкции var».

    Вот ссылка: https://developer.mozilla.org/En/Core_JavaScript_1.5_Reference:Operators:Special_Operators:delete_Operator

    Основанный на ответе @Guffa. Я нашел, что для меня работает следующий метод:

     var obj = { helloText: "Hello World!" }; obj = null; delete obj; 

    Сначала установив obj в null , вы удалили всю ссылку на него, затем вы можете полностью удалить его.

    Я не тестировал его в другом браузере, но это работает в phonegap 1.7.0

    delete не используется для удаления объекта в java Script.

    delete используемый для удаления object key в вашем случае

    var obj = { helloText: "Hello World!" }; var foo = obj; delete obj;

    Объект не удаляется проверка obj все равно принимает одинаковые значения delete use:

    delete obj.helloText

    А затем проверить obj, foo , оба являются пустым объектом.

    Просто нашел jsperf, который вы можете считать интересным в свете этого вопроса. (Было бы удобно держать его вокруг, чтобы завершить изображение)

    Он сравнивает delete , устанавливая значение null и устанавливая undefined .

    Но имейте в виду, что он проверяет случай, когда вы удаляете / устанавливаете свойство много раз.

    Помимо вопросов GC, для производительности следует учитывать оптимизацию, которую браузер может выполнять в фоновом режиме ->

    http://coding.smashingmagazine.com/2012/11/05/writing-fast-memory-efficient-javascript/

    Похоже, что было бы лучше сбросить ссылку, чем удалить ее, поскольку это может изменить класс за кулисами «Использование Chrome».

    IE 5-8 имеет ошибку, в которой использование delete по свойствам объекта-хозяина (Window, Global, DOM и т. Д.) Бросает объект TypeError «не поддерживает это действие».

     var el=document.getElementById("anElementId"); el.foo = {bar:"baz"}; try{ delete el.foo; }catch(){ //alert("Curses, drats and double double damn!"); el.foo=undefined; // a work around } 

    Позже, если вам нужно проверить, где свойство имеет значение полного значения, используйте el.foo !== undefined потому что "foo" in el всегда возвращает true в IE.

    Если вам действительно нужна собственность, чтобы действительно исчезнуть …

     function hostProxy(host){ if(host===null || host===undefined) return host; if(!"_hostProxy" in host){ host._hostproxy={_host:host,prototype:host}; } return host._hostproxy; } var el=hostProxy(document.getElementById("anElementId")); el.foo = {bar:"baz"}; delete el.foo; // removing property if a non-host object 

    Если вам нужно использовать объект-хост с host api …

     el.parent.removeChild(el._host); 

    Я наткнулся на эту статью в своем поиске этого же ответа. То, что я закончил, – это просто вывести obj.pop() все сохраненные значения / объекты в моем объекте, чтобы я мог повторно использовать объект. Не уверен, что это плохая практика или нет. Этот метод пригодился для тестирования моего кода в инструментах Chrome Dev или в FireFox Web Console.

    Установка переменной в null позволяет разбить любые ссылки на объекты во всех браузерах, включая круговые ссылки между элементами DOM и областями Javascript. Используя команду delete мы отмечаем объекты, которые будут очищены при следующем запуске коллекции Garbage, но если есть несколько переменных, ссылающихся на один и тот же объект, удаление одной переменной НЕ освобождает объект, он просто удалит связь между этой переменной И объект. И при следующем запуске коллекции мусора будет очищена только переменная.

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

      for (element in homeService) { delete homeService[element]; 
    JavaScript делает сайт умным, красочным и простым использованием.