【问题标题】:Pushing reference of an object to array将对象的引用推送到数组
【发布时间】:2010-04-23 08:25:06
【问题描述】:

据我所知,在这样的情况下:

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

y.someProp='asd';

这不起作用:

x.push(y);

我想要做的是将 y 的引用添加到 x 以便以后如果我将“删除 y;”我希望它也从数组 x 中删除。

【问题讨论】:

    标签: javascript arrays object


    【解决方案1】:

    您正在混淆变量、引用和对象。

    执行delete y; 会删除变量 y。由于变量不再存在,它自然不再具有值。因此,变量包含的引用消失了。

    然而,移除变量本身并不会移除它所引用的对象。该数组仍然包含对该对象的引用,并且它们都不依赖于变量的存在。

    实际上没有办法直接删除对象。您通过销毁对它的所有引用来删除对象,而不是相反。您希望对象删除它的引用,这根本不是它的工作原理。

    【讨论】:

    • 如果我可以从对象本身的事件中删除数组中对对象的引用就足够了。我可以以某种方式传递对对象的引用吗?
    • @Guffa, delete y 仅适用于全局上下文,此时 ythis.y。阅读:perfectionkills.com/understanding-delete
    • @intacto:为了使对象能够从数组中删除引用,该对象必须包含对所有包含对它的引用的数组的引用。所以,在将对象添加到数组时,还必须将数组添加到对象...
    • @J-P:是的,我知道,但这与问题无关。
    【解决方案2】:

    delete 不是这样工作的。它将删除您传递给它的对象引用 - 而不是对同一对象的任何其他引用。您在这里寻找“弱引用”之类的东西,我不知道在 JavaScript 中实现这些的任何方法。

    【讨论】:

      【解决方案3】:

      这会有帮助吗?

      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;
      

      【讨论】:

      • y 是一个通过引用传递给函数的对象,所以我不能使用这样的东西。
      • 你很快就退出了 :),同时我试图改进我的建议。
      • (即使你将对象传递给函数,它也可以很好地执行 func(x[0]); - 不是吗?)
      • 它不会起作用,因为如果你从 x 中删除一些元素,arrayIndex 将变成 (arraylength-1) 而不是新添加(推送)元素的索引
      【解决方案4】:

      这不起作用:

      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);
      

      【讨论】:

      • 我明白了,谢谢。有没有办法获取新推送元素的索引?
      • @intacto: push() 将元素追加到数组的末尾,返回值是新的长度,因此如果只添加一个元素,则索引将始终为 array.push(item) - 1,例如var index = x.push(y) - 1;
      猜你喜欢
      • 2021-12-04
      • 1970-01-01
      • 2021-07-20
      • 2019-04-08
      • 1970-01-01
      • 2017-07-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多