【发布时间】:2010-04-23 08:25:06
【问题描述】:
据我所知,在这样的情况下:
var x = [];
var y = {};
y.someProp='asd';
这不起作用:
x.push(y);
我想要做的是将 y 的引用添加到 x 以便以后如果我将“删除 y;”我希望它也从数组 x 中删除。
【问题讨论】:
标签: javascript arrays object
据我所知,在这样的情况下:
var x = [];
var y = {};
y.someProp='asd';
这不起作用:
x.push(y);
我想要做的是将 y 的引用添加到 x 以便以后如果我将“删除 y;”我希望它也从数组 x 中删除。
【问题讨论】:
标签: javascript arrays object
您正在混淆变量、引用和对象。
执行delete y; 会删除变量 y。由于变量不再存在,它自然不再具有值。因此,变量包含的引用消失了。
然而,移除变量本身并不会移除它所引用的对象。该数组仍然包含对该对象的引用,并且它们都不依赖于变量的存在。
实际上没有办法直接删除对象。您通过销毁对它的所有引用来删除对象,而不是相反。您希望对象删除它的引用,这根本不是它的工作原理。
【讨论】:
delete y 仅适用于全局上下文,此时 y 为 this.y。阅读:perfectionkills.com/understanding-delete
delete 不是这样工作的。它将删除您传递给它的对象引用 - 而不是对同一对象的任何其他引用。您在这里寻找“弱引用”之类的东西,我不知道在 JavaScript 中实现这些的任何方法。
【讨论】:
这会有帮助吗?
Var x=[{}];
var y=x[0];
编辑: 抱歉,我第一次尝试回答时有点简短。我要开始问的是:为什么 y 首先需要“存在”在数组之外?难道你不能只创建一个对象数组并在需要时使用 delete 或 array.splice() 删除对象吗?
其次,如果 y 需要存在于数组之外,你需要做的要么是创建一个引用数组索引的属性,要么是一个实用函数,它可以扫描数组以找到正确的对象引用消除。换句话说,像
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;
【讨论】:
这不起作用:
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);
【讨论】:
push() 将元素追加到数组的末尾,返回值是新的长度,因此如果只添加一个元素,则索引将始终为 array.push(item) - 1,例如var index = x.push(y) - 1;