大量的JavaScript庫(jQuery的,的Zepto)似乎對querySelectorAll()被調用Array.prototype.slice.call,getElementsByTag或類名結果...爲什麼Array.prototype.slice.call(nodeList)爲DOM元素?
從StackOverflow上讀很多很多類似的問題/答案我做了解它將NodeList結果轉換爲真實數組,以便您可以對NodeLists上不可用的結果調用Array方法(slice,pop) - 但是我不明白爲什麼?您通常不需要在DOM節點列表上真正需要slice/pop + NodeLists已經具有length屬性,因此無論如何它們都可以遍歷。
一些答案似乎暗示它是因爲NodeList指向活動的DOM對象。但是,如果將它轉換爲數組,那麼引用仍然指向活動的DOM節點 - 那又有什麼區別?
或者是我完全失蹤的其他東西?它有助於Zepto/jQuery以某種方式緩存DOM元素的多個屬性調用? (雖然我實在不明白如何,因爲那些仍然生活DOM引用)
你說得對,一個'NodeList'指向活DOM對象,但這意味着當一個被銷燬(或不再是列表的有效項)時,它和它的位置將從列表中刪除。當你切入一個數組時,它不是同一個「實時」列表 - 元素本身是活的,但不是列表本身。當一個物品被銷燬時,它的位置仍然保留在數組中......但它不會代表該元素 - 我猜測它變成了未定義或爲空。 – Ian
@Ian如果一個數組包含對DOM節點的引用,那麼該節點_cannot_將被垃圾收集。 – Alnitak
@Alnitak我明白了,那麼我猜我的評論會改成像「」,它的位置仍然保留在數組中,元素保持不變,直到沒有更多的引用爲止......然後,數組將是未定義的或爲空「。這是正確的嗎? – Ian