许多JavaScript库(jQuery,Zepto)似乎正在对querySelectorAll(),getElementsByTag或ClassName结果调用Array.prototype.slice.call ...

通过阅读关于StackOverflow的许多类似问题/答案,我确实了解到它可以将NodeList结果转换为真实的Array,以便您可以在NodeLists上不可用的结果上调用Array方法(切片,pop),但是我不怎么做不明白为什么?通常,您实际上并不需要在DOM节点列表上进行切片/弹出操作,而NodeLists已经具有length属性,因此它们仍然可以遍历。

一些答案似乎暗示这是因为NodeList指向活动的DOM对象。但是再次,如果将其转换为数组,则引用仍指向活动的DOM节点-那么有什么区别?

还是我完全想念的其他东西?它是否可以帮助Zepto / jQuery以某种方式缓存DOM元素的多个属性调用? (尽管我真的不知道怎么做,因为它们仍然是实时的DOM引用)

最佳答案

通常,您实际上并不需要在DOM节点列表上进行切片/弹出


实际上,您这样做了,这就是为什么这样做是必要的。

例如,.eq().first()等如何工作。 jQuery对象在数组中包含NodeList的副本,然后各个方法获取该数组的切片。同样,您不能将.add()节点连接到NodeList

此外,即使随后从DOM中删除其中的元素,这些数组也必须保持有效。数组中的引用仍然有效,可用于将那些元素重新插入DOM中。

如果您只是活着的NodeList,则将元素从DOM中删除后,它们会自动从列表中消失,除非您另外引用它们,否则它们将永远丢失。

关于javascript - 为什么Array.prototype.slice.call(nodeList)用于DOM元素?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13295361/

10-11 19:25
查看更多