【问题标题】:javascript: remove all object elements of an associative arrayjavascript:删除关联数组的所有对象元素
【发布时间】:2010-01-04 14:19:08
【问题描述】:

我想知道清空关联数组而不导致任何内存泄漏的最有效方法(值是 js 对象)

为了确定,我已经尝试遍历数组的元素,为每个元素对象调用“删除”操作,这样所有的元素对象都将成为垃圾回收的候选对象。最后,我使用以下命令重置 assoc 数组: somearray = {};

是否需要为每个元素调用“删除”操作?或者重置变量值是否足以让所有元素都被垃圾回收?

谢谢!

【问题讨论】:

    标签: javascript arrays object memory-leaks


    【解决方案1】:

    只要您的对象和关联数组都没有在其他任何地方引用,就应该重置数组。

    在每个对象上调用delete 只需要在 IE6 中的 DOM 元素上。见here

    【讨论】:

    • 您好,感谢您的回复。但是,我想进一步澄清我的担忧。我有一个用于存储 GMarker 对象的关联数组。将每个 GMarker 对象添加到数组后,它也会添加到地图中(使用 GMap2.addOverlay() 方法) 当我想从地图中删除所有标记时,我只需调用 GMap2.clearOverlays() 方法。但除此之外,我还必须清除关联数组。这是否意味着当我重置变量时,所有包含的对象最终都会被垃圾收集?提前致谢
    • 是的,他们会的。一般来说,找出答案的最好方法是循环运行你的逻辑一百万次,然后在任务管理器中循环内存使用情况。
    • 我明白了。那我试试感谢您的帮助!
    • 我也想知道同样的事情。谁否决了这个答案?实际上,我试图加 1 分,但当时我收到了“你的次数少于 15 次”的警告信息。
    【解决方案2】:

    somearray.length = 0 应该可以工作。

    【讨论】:

    • 我怀疑虽然这会使数组 behave 对于几乎所有意图和目的来说它都是空的,但仍然会有数字键挂在数组对象上,这将防止在仍然引用数组时(并且尚未将新对象推入其中),它们不会被收集。不过,这是一种有用的技术,可以“清除”一个您知道不会持续很长时间的数组。
    • 关联数组没有长度属性!
    • 尝试再次创建 somearray = new Array();
    • 不会创建一个常规数组而不是一个对象(关联数组)吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-05-30
    • 2017-03-21
    • 1970-01-01
    • 2012-11-04
    • 2019-10-21
    • 1970-01-01
    • 2010-09-25
    相关资源
    最近更新 更多