【问题标题】:What becomes of an array element when it turns null in javascript?当数组元素在javascript中变为null时会变成什么?
【发布时间】:2013-12-19 16:56:32
【问题描述】:

所以我正在写一个大的 AJAX 控件类,我有点好奇。

为了便于交流,假设我在初始化时将页面的所有元素添加到数组中。

当有人执行启用 AJAX 的链接时,后续方法会将指定的内容部分替换为从 AJAX 调用接收到的内容。

但是,假设当此 AJAX 调用完成并替换部分内容内的节点时,先前存储在数组中的节点现在为 null 或未定义(或任何表示死亡的东西......(不是 javascript 大师, 清楚地 ))。

当我再次循环遍历数组中的所有节点时会发生什么?这些元素不再存在了吗?还是他们仍在消耗旧索引的空间,但现在无法访问?

这似乎是一个有点愚蠢的问题,但实际上我只是想看看是否有任何检测和垃圾收集发生在 javascript 数组中的“死”元素上。

感谢和干杯。

【问题讨论】:

  • 看看代码会很有帮助。替换 DOM 中的节点和替换数组的元素是两件不同的事情。
  • 道歉;但要以最简单的方式详细说明,希望不必编写一些代码来演示它,该数组完全由“修改”的 DOM 节点组成。

标签: javascript ajax arrays


【解决方案1】:

如果您在 javascript 中的数组中有一个 DOM 节点,然后将其从 DOM 中删除(例如,在您的 ajax 调用之后),该节点将继续存在于数组中,并继续占用空间。如果您愿意,您可以稍后再次将其添加到 DOM。

如果你不再将它添加到 DOM 中,而是将数组中的项目设置为其他值,例如 null 或 undefined,假设没有对该元素的剩余引用,它将被垃圾收集并且没有占用空间更长。

值得注意的是,javascript 数组与NodeListHTMLCollection 之间存在差异。可以通过调用document.getElementsByTagName等一些DOM方法来获取节点列表。 NodeLists 看起来有点像数组,但仍然是“活动的”,所以如果一个节点从 DOM 中删除,它也会从 NodeList 中删除。

【讨论】:

  • 两个简单的问题;首先,如果我将数组中的元素设置为 null,它是否仍会在数组中保留为“null”元素? IE。我必须从数组中删除索引吗?第二;还有更无聊的——你有 NodeList 实现的好例子吗?
  • 如果你明确地将一个元素设置为 null 或 undefined ,它在数组中保持为 null 或 undefined (尽管你不应该担心这会占用太多空间)。要从数组中删除元素,您需要使用splicemethod,或者如果元素位于开头,您可以使用shift 或结尾pop。您还可以通过将较小的值分配给其.length 属性来截断数组。
  • 基本上,如果您使用返回一个的方法之一,您只需要担心NodeLists。如果你这样做了,并且你并不期望返回的系列是“活的”,那可能会非常令人惊讶。如果您使用getElementsByTagName,或者.children.childNodes 属性,您可以担心它。我相信 xpath 方法也可以选择返回实时迭代器。有时拥有一个实时集合是你想要的,除了数组很好而且更方便一些。
  • 我相信我最终想要做的是使用一个空的 NodeList(绑定到文档?)并填充特定元素 - 但这些元素对特定属性有严格的要求;所以我觉得创建自己的 NodeList 是必须的,但也许我暂时只是拼接出 null 元素。感谢您的帮助。
【解决方案2】:

如果从活动页面中删除 DOM 元素,对它的引用不会变为 null。元素将存储在内存中,直到不再存在对元素的引用并且垃圾收集器已收集垃圾为止。

这意味着,如果将这些节点从其父元素中删除,您将能够使用 DOM 节点数组来恢复这些节点。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-12
    • 1970-01-01
    • 2017-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多