Выдвижение ссылки на объект в массив - PullRequest
3 голосов
/ 23 апреля 2010

Насколько я могу видеть в такой ситуации:

var x = [];
var y = {};

y.someProp='asd';

Это не работает:

x.push(y);

Что я хочу сделать, это добавить ссылку y на x, чтобы позже, если я "удалю y;" Я хочу, чтобы он также был удален из массива х.

Ответы [ 4 ]

2 голосов
/ 23 апреля 2010

Вы смешиваете переменные, ссылки и объекты.

Выполнение delete y; удаляет переменную y. Поскольку переменная больше не существует, она, естественно, больше не будет иметь значения. Таким образом, ссылка на содержащуюся переменную исчезла.

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

На самом деле нет способа удалить объект напрямую. Вы удаляете объекты, уничтожая все ссылки на них, а не наоборот. Вы хотите, чтобы объект удалил свои ссылки, а это просто не то, как он работает.

0 голосов
/ 23 апреля 2010

Это не работает:

x.push(y);

Конечно, это будет работать точно так же, как и предполагалось - отправка значения y в созданный вами массив.

Оператор delete специально предназначен для удаления свойств объектов, если выражение, следующее за оператором, не разрешает свойство, тогда вообще ничего не происходит.

var y = {"someprop":true};

delete y;
alert(y.someprop); // alerts "true"

Попробуйте в окне браузера вставить следующее в адресную строку и нажмите Enter:

javascript:var y = {"someprop":true}; delete y; alert(y.someprop);
0 голосов
/ 23 апреля 2010

Поможет ли это?

Var x=[{}]; var y=x[0];

Edit: Извините, я был немного краток в моей первой попытке ответить. Я бы начал спрашивать: зачем вам вообще «существовать» вне массива? Разве вы не можете просто создать массив объектов и использовать delete или array.splice () для удаления объекта, когда это необходимо?

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

var x=[]; var y={}; y.arrayIndex=(x.push(y)-1);

// later on, you want to get rid of y

delete x[y.arrayIndex]; delete y;
0 голосов
/ 23 апреля 2010

Это не так, как delete работает. Он удалит ссылку на объект, которую вы передаете ему, а не любые другие ссылки на тот же объект. Вы ищете что-то вроде "слабой ссылки" здесь, и я не знаю ни одного способа реализовать их в JavaScript.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...