Удаление переменных в JavaScript Оператор delete
![]()
Блог: http://zametkinapolyah.ru/ Рубрика JavaScript: http://zametkinapolyah.ru/veb-programmirovanie/zametki-po-javascript Паблик блога в ВК: https://vk.com/zametkinapolyah Тематическая группа в ВК: https://vk.com/zametkijs Помощь проекту: WMR: R288272666982 WMZ: Z293550531456 Яндекс.Деньги: 410011531129223 Удалить переменную JavaScript у нас не получится, хотя в нашем распоряжении есть оператор delete, который позволяет удалять свойства объектов, поэтому переменные, объявленные через ключевое слово var называются долговременными: var sampleVar = 25; delete sampleVar; Но если переменная объявлена без ключевого слова var, ее можно удалить при помощи оператора delete, т.к. в этом случае переменная является свойством глобального объекта: myVar = 1; delete myVar; alert(myVar);
Показать больше
Войдите , чтобы оставлять комментарии
Курсы javascript
на сайте с помощью ajax загружаются остальные страницы.
Соответственно js код тоже новый подгружается.
Проблема в том что когда модули заменяются друг на друга, то js переменные висят в памяти от старого модуля.
Как сделать что бы их как буд-то и не было ? удалить полностью, функции, переменные и т.п. весь js код загруженный ранее на странице.
17.11.2011, 21:32
Регистрация: 04.02.2011
Сообщений: 1,815
Удаляем обьекты в java script при помощи delete
// создадим переменную var hello=100; // проверим доступ к переменной, должно быть всё нормуль. alert (hello); // удаляем переменную delete hello; // эта строка выдаст ошибку, потому что переменную hello мы удалили alert (hello);
Практично обьединить весь код страницы в один обьект к примеру page, чтобы удалить его разом.
Можно обойтись и без удаления, просто перезаписать старый обьект page, обьектом page из новой страницы.
также есть такая клёвая штука как конструкторы и деструкторы, пусть к примеру у каждой страницы будет конструктор и деструктор. Конструктор будет запускать плагины, подгружать данные, инициализировать переменный, вешать обработчики событий. А деструктор наоборот вырубать плагины, отвязывать обработчики событий, удалять глобальные обьекты (глобальные обьекты это зло . ), и тд. Открывается страница запускается конструктор, покидаешь запускается деструктор.
Естественно обьеденять и удалять всё надо самому, некакой волшебный метод за тебя эту работу делать не будет. Уборщик мусора не в счёт, он удаляет обьекты на который никто не ссылается.
Если обьект пользователю нафиг не нужен, но он к примеру в глобальной области видимости, то уборщик его никогда не тронет.
delete
где результат вычисления выражения должен быть ссылкой на свойство (объекта), например:
delete object.property delete object['property'] delete object[index] delete property // удаляет свойства глобального объекта, или, // используя инструкцию with, свойства объекта, на который ссылается инструкция
Если результат вычисления выражения не является свойством (объекта), delete ничего не делает.
Параметры
Имя объекта или выражение, результатом вычисления которого является объект.
Целое число, представляющее собой индекс массива, который должен быть удалён.
Возвращаемое значение
Возвращает false, только если свойство существует в самом объекте, а не в его прототипах, и не может быть удалено. Во всех остальных случаях возвращает true.
Описание
Если оператор delete успешно выполняет удаление, он полностью удаляет свойство из объекта. Однако, если свойство с таким же именем существует в цепочке прототипов, объект унаследует это свойство из прототипа.
delete эффективен только применительно к свойствам объектов. Он не оказывает никакого влияния на имена переменных и функций. Присвоение значения свойству без указания объекта (без оператора var) иногда неверно характеризуется, как глобальная переменная, (например x = 5 ). На самом деле происходит присвоение значения свойству глобального объекта.
delete не может удалить определённые свойства встроенных объектов (таких как Object, Array, Math и так далее). В спецификации ECMA-262 они обозначены как DontDelete.
= 42; // создаёт свойство x в глобальном объекте var y = 43; // объявляет новую переменную, y myobj = >; myobj.h = 4; // создаёт свойство h в myobj myobj.k = 5; // создаёт свойство k в myobj delete x; // возвращает true (x - свойство глобального объекта и может быть удалено) delete y; // возвращает false (delete не влияет на имена переменных) delete Math.PI; // возвращает false (delete не влияет на определённые встроенные свойства) delete myobj.h; // возвращает true (свойства, определённые пользователем могут быть удалены) with (myobj) delete k; // возвращает true (эквивалентно delete myobj.k) > delete myobj; // возвращает true (myobj это свойство глобального объекта, не переменная, поэтому может быть удалено)
Если объект наследует свойство от прототипа и не имеет собственного свойства с таким же именем, свойство не может быть удалено при обращении через этот объект. Однако можно удалить это свойство напрямую в прототипе.
function Foo() > Foo.prototype.bar = 42; var foo = new Foo(); delete foo.bar; // возвращает true, но безрезультатно, так как bar - наследуемое свойство alert(foo.bar); // выводит 42, свойство все ещё наследуется delete Foo.prototype.bar; // удаляет свойство из прототипа alert(foo.bar); // выводит "undefined", свойство больше не наследуется
Удаление элементов массива
Когда с помощью оператора delete удаляется элемент массива, длина массива не меняется. Например, если вы удалите a[3] , a[4] по прежнему a[4] , а a[3] не определено. Так будет даже если вы удалите последний элемент массива ( delete a[a.length-1] ).
Когда оператор delete удаляет элемент массива, этот элемент больше не существует в массиве. В следующем примере, trees[3] удаляется с помощью delete .
const trees = ["redwood", "bay", "cedar", "oak", "maple"]; delete trees[3]; console.log(3 in trees); // false
Если вы хотите, чтобы элемент массива существовал, но имел значение undefined, используйте значение undefined вместо оператора delete . В следующем примере, trees[3] принимает значение undefined, но элемент массива все ещё существует:
const trees = ["redwood", "bay", "cedar", "oak", "maple"]; trees[3] = undefined; console.log(3 in trees); // true
Проблема кроссбраузерности
Несмотря на то, что стандарт ECMAScript оставляет порядок итерации по свойствам объектов на усмотрение реализующей стороны, может оказаться так, что все основные браузеры поддерживают порядок итерации, основанный на принципе «свойство добавленное в объект раньше идёт раньше» (по крайней мере для свойств не находящихся в прототипе). Однако, в случае с Internet Explorer, когда кто-нибудь использует delete с каким-либо свойством, это приводит к некоторым неожиданным результатам, заставляя другие браузеры отказаться от использования простых объектов, таких как литералы объектов, в качестве ассоциативных массивов. В Internet Explorer, когда значение свойства установлено в undefined, после удаления этого свойства, если кто-нибудь позже добавит свойство с таким же именем, оно окажется в своей старой позиции, а не в конце итерационной последовательности, как ожидается.
Поэтому, если вы хотите симулировать упорядоченный ассоциативный массив в кроссбраузерной среде, вам придётся либо использовать два отдельных массива (один для ключей и один для значений), либо построить массив из объектов с одним свойством и так далее.
Внешние ссылки
- Глубокий анализ оператора delete
Found a content problem with this page?
- Edit the page on GitHub.
- Report the content issue.
- View the source on GitHub.
This page was last modified on 7 авг. 2023 г. by MDN contributors.
Как очистить переменную?
Написал следующий код: jsfiddle.
Если 1 раз нажать на любой элемент списка, и далее кнопку alert, выведет ID элемента, по которому был клик, но если до нажатия alert нажать на несколько элементов и потом на alert, то будут выводиться все элементы списка, которые были нажаты.
На сколько я понимаю, не происходит очистки. Не могу понять, как же очистить все старое, и выводить только последний элемент, который был выбран.
- Вопрос задан более трёх лет назад
- 2857 просмотров
Комментировать
Решения вопроса 1
Fullstack Web Developer
Действие на нажатие должно назначаться один раз
Ответ написан более трёх лет назад
hrvasiliy @hrvasiliy Автор вопроса
Иван Калиниченко Спасибо! Кучу способов перепробовал, а все дело было в локальной переменной + внутри самого первого клика, правильно?
hrvasiliy самая главная ошибка это множественное назначения действия событию. Получилось, что при каждом клике на li назначалось действие на событие click на див alert. В тот момент когда это происходило id был уже определен. А при новом назначении действия старые не исчезают. Получалась история кликов на li. Id вынесена выше чтобы ее было видно из события нажатия на alert